Vermeidung von statischen Variablen mit Singleton
Ein Kollege von mir erzählte mir, dass ich nie die Verwendung statischer Variablen, denn wenn Sie ändern Sie in einem Platz, Sie sind überall geändert. Er erzählte mir, dass anstelle der Verwendung von statischen Variablen, die ich verwenden soll, Singleton.
Ich weiß, dass Singleton ist für die Beschränkung der Anzahl der Instanzen einer Klasse zu.
Wie kann Singleton mir helfen mit statischen Variablen?
Das ist die point von statischen Feldern. Auch, singetons statische Felder (aber readonly). Dein Freund klingt falsch.
Wenn jemand sagt, "nie" oder "immer," Sie sind in der Regel falsch, vor allem beim Bezug auf ein Merkmal der Sprache an sich.
Ich wäre neugierig zu wissen, wie Ihre Kollegin beabsichtigt, zur Umsetzung des singleton-pattern ohne mit einem statischen Feld.
Ich denke, Ihr Kollege führt Sie in Richtung drehen statische Felder oder Eigenschaften in die Felder oder Eigenschaften einer Klasse, und dann halt eine singleton-Instanz der Klasse. Also die Felder/Eigenschaften selbst sind nicht statisch, sondern die Instanz eines singleton, die von Natur aus würde die Verankerung in einem statischen Feld an der Quelle. Aber, ohne Sie zu zeigen-code mit einem aktuellen problem oder die zimmerreserviereung, ohne das Sie Ihrem Kollegen, hier können wir nicht mit Sicherheit sagen, was die beiden von Ihnen reden.
Aber Bedenken Sie, ob Sie Sie ändern, statische Felder/Eigenschaften, oder die Felder/Eigenschaften einer einzelnen Instanz, die alles sieht, die singleton-Instanz wird auch diese änderungen. Beide Ansätze werden globalen Zustand. Wenn die beobachteten Mutationen sind, was Ihre Kollegen vermeiden will, dann nicht gilt.
Wenn jemand sagt, "nie" oder "immer," Sie sind in der Regel falsch, vor allem beim Bezug auf ein Merkmal der Sprache an sich.
Ich wäre neugierig zu wissen, wie Ihre Kollegin beabsichtigt, zur Umsetzung des singleton-pattern ohne mit einem statischen Feld.
Ich denke, Ihr Kollege führt Sie in Richtung drehen statische Felder oder Eigenschaften in die Felder oder Eigenschaften einer Klasse, und dann halt eine singleton-Instanz der Klasse. Also die Felder/Eigenschaften selbst sind nicht statisch, sondern die Instanz eines singleton, die von Natur aus würde die Verankerung in einem statischen Feld an der Quelle. Aber, ohne Sie zu zeigen-code mit einem aktuellen problem oder die zimmerreserviereung, ohne das Sie Ihrem Kollegen, hier können wir nicht mit Sicherheit sagen, was die beiden von Ihnen reden.
Aber Bedenken Sie, ob Sie Sie ändern, statische Felder/Eigenschaften, oder die Felder/Eigenschaften einer einzelnen Instanz, die alles sieht, die singleton-Instanz wird auch diese änderungen. Beide Ansätze werden globalen Zustand. Wenn die beobachteten Mutationen sind, was Ihre Kollegen vermeiden will, dann nicht gilt.
InformationsquelleAutor petko_stankoski | 2011-11-01
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einer Möglichkeit zur Verwendung eines singleton (gehoben von http://msdn.microsoft.com/en-us/library/ff650316.aspx)
Dann,
Beachten Sie, dass die Instanz Mitglied ist ein statisches Feld. Sie können nicht implementieren eines singleton-ohne die Verwendung einer statischen variable, und (ich glaube mich zu erinnern - es ist schon eine Weile) wird die Instanz freigegeben werden über alle Anfragen. Weil das so ist, es ist grundsätzlich nicht thread-sicher.
Statt, in Erwägung ziehen, diese Werte in einer Datenbank oder einem anderen permanenten Speicher, das ist mehr thread-freundlich, und erstellen Sie eine Klasse, die Schnittstellen mit diesem Teil der Datenbank zu ermöglichen den transparenten Zugriff.
instance
variable mit einem statischen Initialisierer:private static readonly Singleton instance = new Singleton()
? Dann wird Ihr Eigentum kann nur sein:public static Instance => instance;
. Der einzige Unterschied ist, dassinstance
zugeordnet ist, das erste mal dieSingleton
Klasse ist in irgendeinem Kapazität, nicht das erste malInstance
zugegriffen wird. Dies ist ein kleines detail, wie alle Probleme, die diese Ursachen beseitigt werden können durch verschieben der code, um seine eigene Klasse, so dass jeder Zugriff auf die Klasse macht nur dann auftreten, wenn das singleton instanziiert werden können.Ich habe nur bestätigt, dass die statische Initialisierungen sind garantiert nur einmal pro app-Domäne (Vorsicht mit statischen Generika obwohl, wie das ist, einmal pro Generika-Typ). So verwenden Sie eine statische Methode, anstatt eine statische Initialisierer oder statische Konstruktor ist keine gute Idee, wie es mit sich bringt, die non-thread-safe-Probleme, die Sie erwähnen.
Yup, ich habe bemerkt. So, jetzt mein Kommentar hilft all jenen Menschen, die zu dieser Frage der Suche nach aktuellen Antworten, anstatt Sie in die veralteten und archaischen land versuchen, alten code auf neue Rahmenbedingungen! Es ist eine win alle um, richtigen? Ich habe nicht nach unten Abstimmung. Es war eine gute Informationen für die Zeit.
Wenn Sie mögen, werde ich löschen und neu formulieren um nicht zu sagen "keine gute Idee" und kann stattdessen sagen "es gibt jetzt einen besseren Weg, vermeidet alle thread-Fragen der Sicherheit".
InformationsquelleAutor 3Dave
Den ganzen Sinn der
static
modifier ist, um sicherzustellen, dass das Objekt so geändert ist das gleiche, wo immer es verwendet wird, wie es benötigt keine Instanziierung. Der name kam ursprünglich über eine statische variable hat einen festen Standort im Speicher und alle Elemente, die sich auf ihn und verweisen auf den gleichen Speicherbereich.Nun können Sie möchten verwenden ein statisches Feld in einer Klasse, in welchem Fall es existiert, bevor die Klasse instanziiert wird (konstruiert). Es kann vorkommen, dass Sie das wollen.
Singleton ist ein anderes Tier. Es ist eine Klasse, die nur eine einzige Instanziierung durch die Verwendung von einem privaten Konstruktor und eine
static
Eigenschaft. Also in dieser Hinsicht kann man noch nicht verhindern, dass die Statik durch die Verwendung eines singleton.Wo kann ich sagen, dass es existiert, bevor eine Klasse erstellt wird?
Sie sagen, dass es existiert", bevor die Klasse instanziiert wird (errichtet)". Ich denke, das ist verwirrend. Klassen werden nicht instanziiert, die Objekte, die eine Instanz der Klasse sind.
Ich entschuldige mich, ich dachte, dass mit den Worten "(aus)" nach instanziiert, ich hätte deutlich gemacht, dass ein statisches Feld existiert, bevor eine class contructor ausgeführt wird.
Und das ist wieder verwirrend. Was ist ein "class constructor"? Es könnte interpretiert werden als statische Konstruktor oder Instanz-Konstruktor. Obwohl, Sie haben Recht, in beiden Fällen.
InformationsquelleAutor ChrisBD
Let ' s Adresse, mit der Ihr Anweisungen nacheinander:
Es scheint ziemlich klar, dass Ihre Kollegen bedeutet die grundlegende Funktion statische Variablen: es gibt nur eine Instanz in einer statischen variable. Egal, wie viele Instanzen jeder Klasse, die Sie erstellen, jeden Zugriff auf eine statische variable ist die gleichen variable. Es ist nicht eine separate variable für jede Instanz.
Dies ist nicht gut globalen Beratung. Statische Variablen und singletons sind nicht in Konkurrenz zueinander, und sind nicht wirklich ein Ersatz füreinander. Ein singleton ist eine Instanz einer Klasse, so geleitet, dass nur eine Instanz möglich ist, zu erstellen. Eine statische variable ist ebenso gebunden an genau eine (statische) Instanz einer Klasse, aber zugeordnet werden könnte, nicht nur eine class-Instanz, sondern auf einen beliebigen Datentyp wie ein Skalar. In der Wirklichkeit, die effektive Nutzung des singleton-Musters, Sie muss speichern Sie es in einer statischen Variablen. Es gibt keinen Weg, um "die Verwendung einer singleton-statt einer statischen variable".
Auf der anderen Seite, vielleicht meinte er etwas anderes: vielleicht war er versucht zu sagen, dass anstelle der statischen Klasse mit vielen verschiedenen statischen Variablen, Methoden, Eigenschaften und Felder (insgesamt, Mitglieder), die Funktion, als wären Sie eine Klasse, sollten Sie diese Felder nicht statisch, und dann aussetzen der Verpackung eine Klasse als Singleton-Instanz. Brauchen Sie noch einen privaten statische Feld, eine Methode oder eine Eigenschaft (oder vielleicht verwenden Sie einfach eine get-only-Eigenschaft) setzen Sie das singleton.
Eine statische Klasse, die Variablen und singleton sind ähnlich, dass Sie beide sind auf einmal instanziiert (die ehemalige erzwungen, indem der compiler und das letztere durchgesetzt, die durch Ihre Umsetzung). Der Grund würden Sie wollen, zu einem singleton, statt eine statische variable innerhalb einer Klasse ist als singleton benötigt, um eine wahre Instanz einer Klasse, und nicht nur bestehen aus den gesammelten statische member einer statischen Klasse. Dieser singleton-dann zugewiesen bekommt, um eine statische variable, so dass alle Anrufer können sich den Erwerb einer Kopie derselben Instanz. Wie ich oben sagte, können Sie konvertieren Sie alle anderen statischen Mitgliedern Ihrer statischen Klasse-Instanz-Mitglieder Ihre neuen nicht-statische Klasse, die Sie setzen als ein singleton.
Ich möchte auch erwähnen, dass die anderen Antworten bisher haben alle Themen rund um thread-Sicherheit. Im folgenden sind einige richtige Muster für die Verwaltung von Singletons.
Können Sie sehen, dass eine Instanz der
Singleton
- Klasse, die Instanz (oder nicht-statisch) Mitglieder, ist erstellt, entweder durch statische Initialisierung oder innerhalb des statischen Konstruktors, und wird der Variablen zugewiesen_singleton
.. Wir verwenden dieses Muster, um sicherzustellen, dass es instanziiert ist nur einmal. Dann die statische MethodeInstance
bietet nur-lese-Zugriff auf das backing-field-variable, die enthält unser einer, und nur einer Instanz vonSingleton
.oder, die genaue gleichen Sache, aber mit einer expliziten statischen Konstruktor:
Sie können auch eine Eigenschaft Verzug, ohne dass es ein explizites Feld sichern (Folgen) oder in einem statischen Konstruktor zuweisen können, die nur get-Eigenschaft (nicht gezeigt).
Da statische Konstruktoren sind garantiert laufen genau einmal, ob implizite oder explizite, dann gibt es keine Threads zu Fragen der Sicherheit. Beachten Sie, dass alle Zugang zu den
Singleton
Klasse auslösen können statische Initialisierung, auch die Reflexion-Zugang.Können Sie denken statischen Mitglieder einer Klasse, wie fast wie in einer separaten, aber verbundenen, Klasse:
Instanz (non-static) member-Funktion wie eine normale Klasse. Sie Leben nicht, bis Sie durchführen
new Class()
auf Sie. Jedes mal, wenn Sie tunnew
bekommen Sie eine neue Instanz. Instanz-Mitglieder haben Zugriff auf alle statischen Elemente, einschließlich der privaten Mitglieder (in der gleichen Klasse).Statische member sind wie Mitglieder einer eigenen, speziellen Instanz der Klasse, die Sie nicht explizit anlegen mit
new
. Innerhalb dieser Klasse, die nur statische member kann zugegriffen werden oder gesetzt werden. Es ist eine implizite oder explizite statische Konstruktor, der .Net läuft bei dem erstmaligen Zugang wird (genau wie die Instanz der Klasse, nur nicht explizit erstellen, er erstellt, wenn erforderlich). Statische Elemente einer Klasse zugegriffen werden kann, jede andere Klasse kann jederzeit in oder aus einer Instanz, obwohl respektieren zugriffsmodifizierer wieinternal
oderprivate
.Ich aktualisiert meine Antwort. Ist das besser?
Das solltest du nicht sein posting eine Antwort zu sagen, dass die Frage nicht sinnvoll. Wenn Sie denken, dass die Frage macht keinen Sinn, die Abstimmung zu schließen, es als unklar, eher als posting eine Antwort auf eine Frage, die du nicht denkst, ist verständlich.
Die Frage, wie geschrieben keinen Sinn macht, aber der Fragesteller ist Verwirrung einfach zu verstehen und leicht korrigierbar. Haben Sie eine Ressource, die auf meta.stackexchange, unterstützt Ihre position, dass "die Frage macht keinen Sinn, wie geschrieben"? In jedem Fall werde ich umformulieren zu sagen, dass der Fragesteller die Aussagen machen einigen ungültigen Annahmen, die ich kann Ihnen helfen, die richtige für ihn.
Ich brauche nicht zu beweisen, dass die Frage nicht sinnvoll. Sie die einem sagen, dass die Frage nicht sinnvoll ist, beide in Ihrer Antwort (auf mehrere Anlässe) und in Ihrem Kommentar.
InformationsquelleAutor ErikE
Antwort auf die formulierte Frage:
Es ist unglaublich dumm (aber möglich) zum erstellen einer singleton-ohne ein statisches Feld.
Es zu tun, müssen Sie jemand anderes statisches Feld, wie
AppDomain.GetData
oder (in ASP.Net)HttpContext.Anwendung
.InformationsquelleAutor SLaks
Nur um deine Frage zu beantworten (hoffe ich): Anstatt eine statische Klasse mit statischen Mitgliedern wie Class1 können Sie implementieren das Singleton-Muster wie in Class2 (bitte nicht eine Diskussion darüber beginnen, verzögerte Initialisierung an dieser Stelle):
Statt
Class1.DoSomething()
können SieClass2.GetInstance().DoSomething()
.Edit: Wie man sieht, gibt es noch eine (private) statisches Feld im inneren Class2 hält es-Instanz.
Edit2 Antwort auf user966638 Kommentar:
Verstehe ich Sie richtig, dass Sie code wie diesen:
Und Ihr Kollege schlägt vor, Sie zu ersetzen?
Dies könnte der Fall sein, wenn Sie möchten Sie anderen Foo-Instanzen, wobei jede Instanz der bar Attribut kann auf null gesetzt werden beispielsweise. Aber ich bin mir nicht sicher, ob er gemeint ist, was genau ist der use case, von dem er redet.
Class2
static
.Aber die erste Klasse war nicht statisch. Es war normal-Klasse enthält Methoden und Variablen. Einige der Variablen sind statisch.
svick: Sah, dass Fehler zu und korrigiert ihn schon. Trotzdem danke.
InformationsquelleAutor Silas
Beide singleton und statischen Variablen zu geben Sie eine Instanz einer Klasse. Warum sollten Sie lieber singleton gegenüber der statischen ist
Hoffe, das hilft
Das ist überhaupt nicht wahr. Sie können nicht verwalten die Lebensdauer eines singleton. Singletons tun dir nicht helfen, um thread-Sicherheit. Alle Ihre Behauptungen (wahr oder nicht), gelten auch für statische Felder.
ThreadStaticAttribute
Ein statisches Feld oder Eigenschaft noch besitzt, eine einzelne Instanz als Wert.
nicht in der Diskussion. Der Punkt, den ich machte ist straight-forward - ob Sie setzen ein statisches Feld direkt oder über eine Eigenschaft, es gibt immer noch eine Instanz.
InformationsquelleAutor Suhas