Hallo,
in C# wird ja zur Compile-Zeit ein Standardkonstruktor angelegt, wenn man nicht selber einen schreibt. In letzter Zeit begegne ich im .net Framework aber immer öfter Klassen (z.B. AppDomain), wo mir schon zur Designzeit mitgeteilt wird, daß diese keinen Konstruktor hat ("The class 'System.AppDomain' has no constructors defined". Ich wüßte gerne mal, wie man so etwas macht. Über einen private accessor am Konstruktor geht es nicht, denn in diesem Fall meldet Intellisense "Cannot access private constructor 'XYZ' here".
kein constructor bedeutet, das es keinen gibt, den du sehen kannst. ist er z.b. in einer fremden assembly, dann generiert er dir die genannte fehlermeldung. ist es aber dein code, und du versuchst so ein objekt zu instanziieren, dann generiert er dir die meldung das du versuchst auf etwas zuzugreifen, wo du es explizit verbieten wolltest. so kannst du gleich differenzieren, ob du überhaupt eine chance hast das objekt zu instanziieren, da man eigenen code notfalls ändern kann.
Was meinst du mit "fremde Assembly"? Ich habe mal probehalber eine Class Library gebastelt und diese in einem anderen Projekt referenziert. Dort kommt ebenfalls die Meldung "Cannot access private..." bzw. "Cannot access internal...".
An die pdb hatte ich nicht gedacht... nein das war's auch nicht. Ich habe mir gerade mal die AppDomain-Klasse vom Microsoft-Source-Server geholt und angeschaut. Ich verstehe es nicht. Der Konstruktor ist tatsächlich so wie du es geschildert hast und er besitzt auch keine Attribute. Ich hoffe es geht in Ordnung wenn ich hier ein paar Schnipsel poste.
[ClassInterface(ClassInterfaceType.None)]
[ComDefaultInterface(typeof(System._AppDomain))]
[ComVisible(true)]
public sealed class AppDomain : MarshalByRefObject, _AppDomain, IEvidenceFactory
{
... und der Konstruktor:
private AppDomain() {
throw new NotSupportedException(Environment.GetResourceString(ResId.NotSupported_Constructor));
}
Ich hoffe es geht in Ordnung wenn ich hier ein paar Schnipsel poste.
kannst du ja auch im
[Artikel] .NET Reflector
ansehen 😃
Sicher. Es sieht dort (fast) exakt so aus:
[[COLOR]ComVisible[/COLOR]([COLOR]true[/COLOR]), [COLOR]ClassInterface[/COLOR]([COLOR]ClassInterfaceType.None[/COLOR]), [COLOR]ComDefaultInterface[/COLOR]([COLOR]typeof[/COLOR]([COLOR]_AppDomain[/COLOR]))]
[color]public sealed class[/COLOR] [B]AppDomain[/B] : [COLOR]MarshalByRefObject[/COLOR], [COLOR]_AppDomain[/COLOR], [COLOR]IEvidenceFactory[/COLOR]
Hallo Cyron,
Um den Konstruktor zu unterdrücken giebts folgende Methoden:
Abstract:
public abstract class XXX{}
Static:
public static class XXX{}
protected-Konstruktor
public class XXX{ protected XXX{} }
private-Konstruktor
public class XXX{ private XXX{} }
Jede Variante hat eigene Auswirkungen und sollte man in der MSDN und/oder einem C#-Buch nachschlagen.
Gruß
Juy Juka
Wo wir grad beim Thema sind, die CLR erlaubt es einem Member auch den Zugriffsmodifizierer protected internal zuzuweisen. Leider wird dieser in C# nicht unterstützt.
Es gibt 3 Arten von Menschen, die die bis 3 zählen können und die, die es nicht können...
Wieso nicht? Das geht doch. Oder meinst du was anderes?
public class Foo
{
public Foo()
{
}
protected internal Foo(int i)
{
}
protected internal int Bla { get; set; }
}
"Jedes Ding hat drei Seiten, eine positive, eine negative und eine komische." (Karl Valentin)
Sorry mein Fehler. C# unterstützt natürlich schon immer protected internal, das ist gleich bedeutend mit CLR: Family-and-Assembly. Für Family-or-Assembly gibt es keine Entsprechung in C#
PS:
Family = protected
Assembly = internal
Es gibt 3 Arten von Menschen, die die bis 3 zählen können und die, die es nicht können...
Hallo JuyJuka,
wie man es anstellt daß man einen Konstruktor unterdrücken kann, weiß ich schon. Mir geht es um die Frage, wie bekomme ich es hin daß Intellisense "The Class XYZ has no constructor defined" ausgibt.
Reine Neugierde. 🙂
Es geht, aber ich weiß nicht wie - und das nervt mich einfach. =)
Hallo Cyron,
hast du denn mal alle genannten Möglichkeiten ausprobiert und geguckt, bei welcher welche Meldung kommt?
und das nervt mich einfach
Möglicherweise nervt der Verlauft des Threads langsam auch einige. 😃 Wir helfen ja gerne, aber doch nicht wegen nichts. Wenn es dich wirklich so brennend interessiert. dann unternimm bitte selbst die Anstrengung, es herauszufinden.
herbivore
C# unterstützt natürlich schon immer protected internal, das ist gleich bedeutend mit CLR: Family-and-Assembly.
protected internal entspricht Family-or-Assembly, da sowohl abgeleitete Typen in beliebigen Assemblies, sowie Typen in der gleichen Assembly auf diesen Member zugreifen können.