Wie implementiert man ein Singleton in C #?
Wie implementiere ich das singleton pattern in C#? Ich möchte meine Konstanten und einige grundlegende Funktionen wie benutze ich diese überall in meinem Projekt. Ich möchte Sie 'Global' und nicht manuell binden Sie jedes Objekt ich erzeugen.
Kommentar zu dem Problem
Ich habe ein Artikel über das singleton-pattern, das sollte helfen (und wird im Allgemeinen als nützlich). Lassen Sie mich wissen, wenn Sie weitere Informationen benötigen.
Ah dieses berühmten Artikel wurde geschrieben von dem berühmten Jon Skeet. Ich erinnere mich, wie hilfreich diese war vor einiger Zeit aber nie die Mühe gemacht, zu überprüfen, wer es geschrieben hat. Danke!
Ich Lesen Sie es, bevor Sie gehen, um jede und jeden interview
Haha Jon, "im Allgemeinen als nützlich angesehen" - die Untertreibung des Jahrhunderts! Was sind die pageview-Statistiken wie auf, der Seite gegenüber dem rest der Seite? Ich Wette, es erzeugt einen erheblichen % - Alter.
Ich denke man sollte es nehmen die Stimmen zu berücksichtigen und überdenken Sie Ihre Antwort akzeptiert.
InformationsquelleAutor der Frage Andre | 2008-10-29
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie nur die Speicherung einige Globale Werte und haben einige Methoden, die nicht brauchen, Staat, brauchen Sie nicht, singleton. Stellen Sie einfach die Klasse und Ihre Eigenschaften/Methoden statisch.
Singleton ist besonders nützlich, wenn Sie eine normale Klasse mit dem Staat, aber Sie wollen nur eine von Ihnen. Die links, die andere zur Verfügung gestellt haben sollte nützlich sein bei der Erforschung des Singleton-Musters.
InformationsquelleAutor der Antwort tvanfosson
Singleton != Global
. Sie scheinen auf der Suche für das Stichwortstatic
.InformationsquelleAutor der Antwort yfeldblum
Können Sie wirklich vereinfachen Sie die singleton-Implementierung, das ist, was ich verwenden:
InformationsquelleAutor der Antwort FlySwat
Hmm, das scheint alles ein bisschen kompliziert.
Warum müssen Sie eine dependency-injection-framework zu bekommen, ein singleton? Mit einem IOC-container ist in Ordnung für einige enterprise-app, (solange es nicht überstrapaziert natürlich), aber, ah, der Kerl will einfach nur wissen, aboiut Umsetzung der Muster.
Warum nicht immer eifrig instanziiert, dann liefern eine Methode, die zurückgibt, wird die statische, die meisten der code oben geschrieben geht dann Weg. Folgen Sie der alten C2-Sprichwort - DoTheSimplestThingThatCouldPossiblywork...
InformationsquelleAutor der Antwort Chris Brooks
Singletons nur dann Sinn machen, wenn beide der folgenden Bedingungen erfüllt sind:
Beachten Sie, dass #2 nicht bedeutet, dass Sie würde wie das Objekt nur eine einzige Instanz - wenn das der Fall ist, einfach instanziieren Sie es nur einmal - es bedeutet, dass es muss (wie in, es ist gefährlich, für die dies nicht der Fall ist) immer nur eine einzige Instanz.
Wenn Sie möchten, dass global nur eine Globale Instanz von einige (nicht signleton) Objekt (oder machen es statische oder was auch immer).
Wenn Sie möchten, dass nur eine Instanz, wieder statisch ist dein Freund. Auch, einfach nur ein Objekt instanziieren.
Das ist meiner Meinung nach sowieso.
InformationsquelleAutor der Antwort Dan
Ich würde Ihnen empfehlen, Lesen Sie den Artikel Erkunden Sie das Singleton-Entwurfsmuster auf MSDN verfügbar. Es wird ausführlich auf die Funktionen des Frameworks, die das Muster einfach zu implementieren.
Als ein beiseite, ich würde check out der Verwandte Lesung auf SO zu Singletons.
InformationsquelleAutor der Antwort cciotti
Ignorierte die Frage von, ob oder nicht Sie sollten mit den Singleton-Muster, die schon an anderer Stelle diskutiert, ich würde implementieren eines singleton wie diese:
InformationsquelleAutor der Antwort Sam Meldrum
Static singleton ist ziemlich viel ist ein anti-pattern, wenn Sie möchten, eine lose gekoppelte design. Vermeiden Sie, wenn möglich, und es sei denn, dies ist ein sehr einfaches system würde ich empfehlen, einen Blick auf eine der vielen dependency injection-frameworks zur Verfügung, wie http://ninject.org/ oder http://code.google.com/p/autofac/.
Registrieren /verbrauchen-Typ konfiguriert als ein singleton in autofac Sie tun würden, etwas wie die folgenden:
Die akzeptierte Antwort ist eine schreckliche Lösung, die durch die Art und Weise, wenigstens mal Kerle, die tatsächlich implementiert das Muster.
InformationsquelleAutor der Antwort user7375
InformationsquelleAutor der Antwort awaisj
Ich mag dieses Muster, obwohl es nicht verhindern, dass jemand von der Schaffung eines nicht-singleton-Instanz. Es kann manchmal besser sein kann zu erziehen, die die Entwickler in Ihrem team, der Einsatz der richtigen Methodik vs. Los zu heroischen Anstrengungen, um zu verhindern, dass einige knucklehead aus, die mit Ihrem code auf die falsche Weise...
Dadurch erhalten Sie eine einzelne Instanz (instanziiert dem richtigen Weg) und wird wirksam verzögert werden, da der statische Konstruktor nicht aufgerufen werden, bis der Build() aufgerufen wird.
InformationsquelleAutor der Antwort Scott P
Was Sie beschreiben, ist lediglich statische Funktionen und Konstanten, nicht ein singleton. Das singleton-design-Muster (das ist sehr selten nötig) beschreibt eine Klasse, die ist instanziiert, aber nur einmal, automatisch, wenn Sie erstmals verwendet werden.
Er verbindet lazy-Initialisierung mit einem Scheck zu verhindern mehrfacher Instanziierung. Es ist nur wirklich nützlich für Klassen, wickeln Sie einige Konzept, das physisch in der Einzahl, wie ein wrapper um ein hardware-Gerät.
Statische Konstanten und Funktionen sind genau das: code, der braucht nicht eine Instanz auf alle.
Fragen Sie sich diese: "Wird diese Klasse zu brechen, wenn es mehr als eine Instanz?" Wenn die Antwort ist Nein, brauchen Sie nicht ein singleton.
InformationsquelleAutor der Antwort munificent
hmmm... Paar Konstanten mit zugehörigen Funktionen... wäre das nicht besser erreicht werden durch Enumerationen ? Ich weiß, Sie können erstellen Sie eine benutzerdefinierte Enumeration in Java mit Methoden und alle, die derselben erreicht werden soll in C#, wenn Sie nicht direkt unterstützt wird, dann kann man mit einfachen singleton-Klasse mit privatem Konstruktor.
Wenn Ihr Konstanten sind semantisch Verwandte sollten Sie als enums (oder äquivalentes Konzept) erhalten Sie alle Vorteile der const static-Variablen + Sie werden in der Lage sein zu verwenden, um Ihren Vorteil der Typ-überprüfung des Compilers.
Meine 2 cent
InformationsquelleAutor der Antwort Newtopian
Ich würde persönlich gehen für ein dependency injection-framework, wie Unity, alle von Ihnen sind in der Lage, zu konfigurieren singleton-Objekte in den container und verbessern würde Kopplung durch den Wechsel von einer Klasse in Abhängigkeit von interface-Abhängigkeit.
InformationsquelleAutor der Antwort t3mujin
Verstecken öffentlichen Konstruktor, hinzufügen von private static Feld zu halten, das nur die Instanz, und das hinzufügen einer statischen factory-Methode (mit lazy-Initialisierung) zurück, die einzige Instanz
InformationsquelleAutor der Antwort Charles Bretana
Ich geschrieben habe eine Klasse für mein Projekt die Verwendung des Singleton-Musters. Es ist sehr einfach zu bedienen. Hoffe, es wird für Sie arbeiten. Finden Sie bitte den folgenden code.
Nun kann der Variablen-Wert für den obigen code in Ihrer Anwendung wie diese..
Und können Sie abrufen dieser Wert wie diese..
InformationsquelleAutor der Antwort Sapnandu
In c# könnte es sein (Thread-safe sowie lazy initialization):
InformationsquelleAutor der Antwort brajesh jaishwal