2017-10-05 3 views
4

Ich habe vor kurzem angefangen zu lernen C# und ich bin über etwas verwirrt. Die documentation für statische Klassen sagt mir, dass sie nur statische Mitglieder enthalten können. Dennoch kann ich nichtstatische verschachtelte Klassen und Strukturen innerhalb meiner statischen Klasse definieren.Warum können statische C# -Klassen nicht statische Klassen/Strukturen enthalten?

Ich vermute, dass Klasse/Struct-Definitionen zählen nicht als Mitglieder, aber warum ist das erlaubt? Wenn eine verschachtelte Klasse einer statischen Klasse instanziiert werden kann, widerspricht das nicht dem Punkt einer statischen Klasse? Missverstehe ich hier etwas Offensichtliches?

+0

Bad Wortlaut auf meinen Teil, ich meinte geschachtelt Klasse zu sagen. –

+0

Ich würde sagen, dass Sie das Offensichtliche vermissen ... Ein 'statischer' Hauptzweck ist es, die Instanziierung dieser Klasse zu verhindern. – Phil1970

+0

Ich betrachte eine verschachtelte Klasse als ein * statisches Mitglied * ihrer einschließenden Klasse, unabhängig davon, ob es eine * statische Klasse * ist oder nicht. (Dies ist anders als bei Java, wo verschachtelte Klassen * nicht * immer statische Mitglieder der einschließenden Klasse sind und der Ausdruck "statische Klasse" eine verschachtelte Klasse bedeutet, die * ein statisches Mitglied ist.) –

Antwort

7

In C# sind verschachtelte Klassen keine Unterklassen, die umgebende Klasse ähnelt eher einem anderen Namespace. Sie haben keinen Zugriff auf eine Instanz der äußeren Klasse innerhalb der inneren Klasse (im Gegensatz zu zB Java). Aus diesem Grund können statische Klassen verschachtelte Typen enthalten.

Ein berühmtes Beispiel, das LINQ class Enumerable, das statisch ist. Es enthält viele Hilfsklassen:

So ist die umgebende statische Klasse ein logischer Container für die innere Klasse. Es gehört dort, weil es von der statischen Klasse verwendet wird und oft nicht von irgendwo anders zugänglich ist (wenn nicht öffentlich).

Aber Sie haben Recht, es ist ein Mangel an Dokumentation. Sie sollen gesagt haben:

nur statische Elemente oder verschachtelte Typen Enthält

+0

In gewisser Weise ein (verschachteltes) Klassendefinition ist etwas Statisches. – Haukinger

+0

@Haukinger: Nein, Sie können mehrere Instanzen erstellen: 'var i1 = new OuterC.InnerC(); var i2 = new OuterC.InnerC(); '(wenn es zugänglich ist) –

+0

Sicher, der definierte Typ kann statisch sein oder nicht, aber die _definition_ ist statisch. Du schreibst nicht 'var x = new OuterC(); var y = new x.InnerC(); '... – Haukinger

4

Die Dokumentation ist ein wenig fehlt, aber verschachtelte Klassen/Strukturen sind in statischen Klassen zulässig und können auch statisch oder instanziiert sein. Betrachten Sie den folgenden Code ein:

namespace StaticClasses 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      new Foo(); // Cannot create an instance of the static class 'Foo' 
      new Foo.Bar(); // Cannot create an instance of the static class 'Foo.Bar' 
      new Foo.Baz(); 
     } 
    } 

    static class Foo 
    { 
     public static class Bar 
     { 

     } 

     public class Baz 
     { 

     } 
    } 
} 

In diesem Zusammenhang sind statische Klassen ähnlich wie Namespaces, aber Namespaces (wahrscheinlich) besser beschreiben die semantischen Beziehungen als verschachtelte Klassen.

Verwandte Themen