2008-11-27 9 views

Antwort

23

Statische Klassen werden automatisch versiegelt, sodass Personen ihr Verhalten nicht erben und überschreiben können.

, dass die einzige wirkliche Unterschied ist (es sei denn, es ist etwas Besonderes in der IL ist)

Also, wenn Sie eine statische Klasse verwenden, können Sie sich die Mühe machen der Konstruktor privat speichern, und zu erklären, die Klasse versiegelt.

Ich würde hinzufügen, dass das Definieren einer Klasse als statisch, "selbst-Dokumentieren" Code ist. Benutzer Ihrer Bibliothek wissen, dass diese Klasse nicht instanziiert werden soll und nur statische Werte aufweist.

+2

Es gibt tatsächlich etwas Besonderes in der IL. Statische Klassen werden sowohl als abstrakt als auch als versiegelt markiert (was in C# nicht anders möglich ist), wodurch die Instanziierung absolut verhindert wird. –

+3

Beachten Sie, dass nach Mehrdad (http://stackoverflow.com/questions/5241899/what-is-the-difference-between-static-methods-in-a-non-static-class-and-static -me/5241927 # 5241927)), ein weiterer Unterschied besteht darin, dass statische Methoden in nicht statischen Klassen keine Erweiterungsmethoden sein können. – Benjol

17

Eine statische Klasse kann niemals instanziiert werden. Auf keinen Fall, nein wie.

Eine nicht statische Klasse mit einem privaten Konstruktor, aber alle statischen Methoden können auf verschiedene Arten missbraucht werden - Vererbung, Reflektion, Aufruf des privaten Konstruktors in einer statischen Factory - um die Klasse zu instanziieren.

Wenn Sie nie Instanziierung wollen, würde ich mit der statischen Klasse gehen.


bearbeiten - Klärung für FosterZ Kommentar

Sagen Sie bitte dieses Utility-Klasse haben:

public class Utility 
{ 
    public static string Config1 { get { return "Fourty Two"; } } 

    public static int Negate(int x) { return -x; } 

    private Utility() { }  
} 

Wenn ein anderer Entwickler nicht klar, auf seine Absicht ist, könnten sie dies tun:

public class Utility 
{ 
    public static string Config1 { get { return "Fourty Two"; } } 
    public int Config2 { get; set; } 

    public static int Negate(int x) { return -x; } 

    private Utility() { } 

    /// Get an instance of Utility  
    public static Utility GetUtility() 
    { 
     return new Utility(); 
    } 
} 

Jetzt haben Sie eine Frankenstei n Klasse. Einige seiner Funktionen erfordern Instantiierung und andere nicht. Vielleicht ist es das, was du willst, aber vielleicht ist es das nicht. Sie könnten dies mit Code-Review verhindern, aber warum machen Sie Ihre Absichten nicht explizit im Code? Wenn Sie die Klasse als static markieren, werden mögliche Verwechslungen ausgeschlossen. Sie können eine statische Klasse nicht instanziieren oder von ihr erben.

+0

können Sie mir bitte ein kleines Beispiel für diesen Punkt geben "rufen Sie den privaten Konstruktor in einer statischen Fabrik - um die Klasse zu instanziieren", finde ich etwas schwierig zu verstehen ... – FosterZ

+2

@FosterZ - Ich habe ein Beispiel zu meiner Antwort hinzugefügt. Prost. –

+0

thnku sehr viel Kumpel .... jetzt bekomme ich es .. – FosterZ

15

Zusätzlich zu den vorherigen Antworten: Der Compiler erlaubt nicht-statische Mitglieder auf statische Klassen und produziert und Fehler. Dies kann ein wenig dazu beitragen, dass nicht versehentlich nicht statische Elemente hinzugefügt werden.

1

Auch ich werde mit dem privaten Konstruktor gehen, der niemals von den statischen Methoden aufgerufen wird. Also wäre jede Initialisierung dort verschwendet ... Aber das ist nur eine Theorie.

3

Sie können Objekt einer Klasse übergeben, die privaten Konstruktor als Parameter für eine beliebige Methode hat, aber Sie können nicht dasselbe mit der statischen Klasse tun. Dies ist der Hauptunterschied.

Verwandte Themen