Laden...

Wie macht man eine Klasse ohne Konstruktor?

Erstellt von userid4382 vor 15 Jahren Letzter Beitrag vor 15 Jahren 12.492 Views
U
userid4382 Themenstarter:in
239 Beiträge seit 2006
vor 15 Jahren
Wie macht man eine Klasse ohne Konstruktor?

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".

Gelöschter Account
vor 15 Jahren

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.

U
userid4382 Themenstarter:in
239 Beiträge seit 2006
vor 15 Jahren

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...".

Gelöschter Account
vor 15 Jahren

hm... hast du die pdb´s mitkopiert?

wie dem auch sei. ich habe extra nochmal den reflector angeschmissen und AppDomain hat einen privaten konstruktor.

U
userid4382 Themenstarter:in
239 Beiträge seit 2006
vor 15 Jahren

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)); 
        } 
Gelöschter Account
vor 15 Jahren

Ich hoffe es geht in Ordnung wenn ich hier ein paar Schnipsel poste.

kannst du ja auch im
[Artikel] .NET Reflector
ansehen 😃

U
userid4382 Themenstarter:in
239 Beiträge seit 2006
vor 15 Jahren

Zeigt der Reflector auch Attribute an?

946 Beiträge seit 2008
vor 15 Jahren

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]

2.187 Beiträge seit 2005
vor 15 Jahren

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

Gelöschter Account
vor 15 Jahren

(*hust* internal hust){gray}

3.971 Beiträge seit 2006
vor 15 Jahren

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...

3.511 Beiträge seit 2005
vor 15 Jahren

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)

656 Beiträge seit 2008
vor 15 Jahren

C# unterstützt :::

Gruß, BhaaL

3.971 Beiträge seit 2006
vor 15 Jahren

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...

U
userid4382 Themenstarter:in
239 Beiträge seit 2006
vor 15 Jahren

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.

Gelöschter Account
vor 15 Jahren

gegenfrage: wozu und warum stört dich das?

U
userid4382 Themenstarter:in
239 Beiträge seit 2006
vor 15 Jahren

Reine Neugierde. 🙂
Es geht, aber ich weiß nicht wie - und das nervt mich einfach. =)

49.485 Beiträge seit 2005
vor 15 Jahren

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

M
1.439 Beiträge seit 2005
vor 15 Jahren

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.