Ist es eine schlechte Übung, einen Zustand in einer statischen Klasse zu haben?

8

Ich würde gerne so etwas tun:

%Vor%

Dies würde mir erlauben, die globale Sammlung von Foo s von überall aus zu verwalten. Allerdings wurde mir gesagt, dass statische Klassen immer zustandslos sein sollten - Sie sollten sie nicht zum Speichern globaler Daten verwenden. Globale Daten scheinen im Allgemeinen verpönt zu sein. Wenn ich eine statische Klasse nicht verwenden sollte, was ist der richtige Weg, um dieses Problem anzugehen?

Hinweis: Ich habe eine ähnliche Frage , aber die gegebene Antwort trifft in meinem Fall nicht wirklich zu.

    
Matthew Pirocchi 02.05.2010, 16:24
quelle

7 Antworten

9

Wer bleibt, dass statische Klassen zustandslos sein sollten? Static bedeutet angegeben.

Wissen Sie, wie statische Klassen in der CLR funktionieren:

  • Sie können die Zeit, zu der statische Konstruktoren aufgerufen werden, nicht steuern.
  • Statische Klassen haben für jedes aufrufende Programm einen separaten Status.

Achten Sie auch auf Nebenläufigkeitsprobleme.

Als Randnotiz erstaunt es mich, wie oft Leute sagen "Benutze X nicht". Es wäre, als würde jemand in deinen Werkzeughäuschen gehen und auf ein halbes Dutzend Werkzeuge zeigen und sagen: "Diese Werkzeuge sind eine schlechte Übung." Es macht keinen Sinn.

    
harpo 02.05.2010, 16:32
quelle
4

Globale Daten sind sowohl mächtig als auch eine häufige Quelle von Problemen, weshalb Techniken wie Dependency Injection verwendet werden. Sie können sich das als normales Entkopplungsproblem vorstellen. Globale Daten, auf die direkt an vielen Stellen in Ihrem Programm verwiesen wird, bilden eine starke Kopplung zwischen diesen globalen Daten und all diesen Orten.

In Ihrem Beispiel haben Sie jedoch den Zugriff auf die Daten in einer Klasse isoliert, die die genauen Details des Zugriffs auf die globalen Daten steuert. Da einige globale Daten oft unvermeidlich sind, halte ich das für einen guten Ansatz.

Sie können beispielsweise vergleichen, wie app.config und web.config über das .NET-Framework verwendet werden. Sie werden über eine statische Klasse System.Configuration.ConfigurationManager mit einer statischen Eigenschaft AppSettings , die die Details zum Erreichen der globalen Daten verbirgt.

    
Anders Abel 02.05.2010 16:29
quelle
3

Was Sie hier suchen, ist eine Singleton-Klasse, keine statische Klasse. Statische Klassen und Methoden sollten für statusfreie Routinen angegeben werden. Eine Singleton-Klasse wird nur einmal pro Anwendungslauf instanziiert und hat die volle Funktionalität einer Klasse als solche. Jedes Mal, wenn Sie es in der Zukunft referenzieren, erhalten Sie die exakt gleiche Instanz mit exakt denselben Elementeigenschaften zurück.

Das erste Google-Ergebnis für "C # singleton" scheint eine ziemlich vernünftige Erklärung für die Implementierung zu haben. Ссылка

    
Jordan T. Cox 02.05.2010 16:28
quelle
2

Es ist nicht generell schlecht. In einigen seltenen Fällen ist es notwendig, dies zu tun, als etwas anderes mit großem Aufwand zu implementieren.

Es wird jedoch empfohlen, auf die Thread-Sicherheit zu achten.

Sie sollten jeden Anruf in Ihrem Wörterbuch sperren, so dass nur ein Thread gleichzeitig darauf zugreifen kann.

%Vor%     
DHN 02.05.2010 16:32
quelle
0

Verwenden Sie eine schreibgeschützte statische Eigenschaft in Ihrer Klasse, diese Eigenschaft ist für alle Instanzen der Klasse gleich. Inkrementieren Sie es und dekrementieren Sie es nach Bedarf aus dem Konstruktor usw.

    
Brettski 02.05.2010 16:32
quelle
0

Ich benutze ständig Listen in statischen Klassen für Dinge, die sich niemals (oder extrem selten) ändern werden - praktisch zum Laden von Auswahllisten und so, ohne jedes Mal die db zu drücken. Da ich keine Änderungen erlaube, muss ich mich nicht um Sperren / Zugriffskontrolle kümmern.

    
Ray 02.05.2010 16:51
quelle
0

Eine andere Sache, die in Betracht gezogen werden sollte, ist die Anwendung selbst und das Budget dafür. Ist wirklich etwas komplexer als eine statische Klasse?

    
George Handlin 02.05.2010 17:21
quelle