Wenn ich Dienstprogrammklassen erstellen, erstelle ich normalerweise eine Klasse, die einen privaten Konstruktor hat und alle ihre Methoden und Eigenschaften als statisch darstellt. Was ist der beste Ansatz dafür? Was ist der Unterschied zwischen meiner Art, eine statische Klasse zu erstellen?Statische Klasse Vs. Klasse mit privatem Konstruktor und allen statischen Eigenschaften und Methoden?
Antwort
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.
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.
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
@FosterZ - Ich habe ein Beispiel zu meiner Antwort hinzugefügt. Prost. –
thnku sehr viel Kumpel .... jetzt bekomme ich es .. – FosterZ
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.
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.
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.
- 1. Statische Initialisierung mit privatem Konstruktor
- 2. Instanziierende interne Klasse mit privatem Konstruktor
- 3. Was ist der Unterschied zwischen einer Klasse mit privatem Konstruktor und einer versiegelten Klasse mit privatem Konstruktor?
- 4. abstrakte Klasse vs private Konstruktor
- 5. Statische Methoden oder keine statischen Methoden in der Dao-Klasse?
- 6. Statische Klasse vs Singleton
- 7. Python-Klasse statische Methoden
- 8. Einzeln verwendete Klasse vs. "statische Klasse"
- 9. Instanziieren einer Klasse mit privatem Konstruktor mit Java/Mockito/PowerMockito
- 10. Objekt mit privatem Konstruktor und einem statischen Container (Map) von sich selbst?
- 11. Enum VS Statische Klasse (Normal und mit String-Werten)
- 12. Erweiterungsmethoden vs statische Dienstprogramm Klasse
- 13. Statische Eigenschaften in statischen Klassen
- 14. Statischer Konstruktor & Singleton-Klasse
- 15. Java-Klasse vs C++ Klasse statische vs Instanz
- 16. Abstrakte Klasse mit allen konkreten Methoden
- 17. PHP-Klasse statische und nicht statische
- 18. Funktionen vs. statische Methoden
- 19. Android statische Klasse vs nicht-statische Klasse Speicher Leistung
- 20. Aurelia-Klasse Konstruktor vs Aktivieren
- 21. Statische Variablen auf Eigenschaften Datei vs Singleton vs Static Klasse vs Enum
- 22. ASP.NET nicht statische Klasse innerhalb einer statischen Klasse Thread-Sicherheit
- 23. Statische Methoden vs Instanz Methoden in C#
- 24. Methoden in Eigenschaften als einzelne Klasse anzeigen
- 25. Zugang statische Methoden und Attribute der Freund Klasse in ABAP
- 26. Wie nicht-statische Kind Klasse der statischen Klasse serialisiert
- 27. Konstruktor vs nicht-statische Init-Block
- 28. Gewindesicherheit und Generika in einer statischen Klasse
- 29. Leistung der Verwendung von statischen Methoden vs. Instanziierung der Klasse mit den Methoden
- 30. Statische innere Klasse nicht statische Felder Echtzeit-Dienstprogramm und Codesyntax
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. –
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