Singleton

    • C#
    • .NET (FX) 3.0–3.5

    Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von nikeee13.

      Abend,

      hier mal ein Beitrag zum Thema Singleton.
      Als Entwickler möchte man ab und an sicherstellen, dass von einer Klasse maximal eine Instanz erzeugt wird.
      Hierzu verwendet man ein Singleton (-> de.wikipedia.org/wiki/Singleton_(Entwurfsmuster)))

      Implementierung
      Wie geht man also vor, um nur eine Instanz zu erlauben? Das ist im Prinzip ganz einfach: Man verwendet eine
      statische (VB: Shared) Funktion, die eine Instanz zurückgibt. Theoretisch kann man hier auch mit einer Property arbeiten.
      Man erhält also immer die selbe Instanz.

      C#-Quellcode

      1. class SingleInstance
      2. {
      3. private static SingleInstance Instance = new SingleInstance();
      4. private SingleInstance() { }
      5. public static SingleInstance GetInstance()
      6. {
      7. if (Instance == null)
      8. {
      9. Instance = new SingleInstance();
      10. return Instance;
      11. }
      12. else { return Instance; }
      13. }
      14. }


      Grüße

      Edit by ErfinderDesRades: eine weiterführende Diskussion habe ich hierher ausgelagert
      "Life isn't about winning the race. Life is about finishing the race and how many people we can help finish the race." ~Marc Mero

      Nun bin ich also auch soweit: Keine VB-Fragen per PM! Es gibt hier ein Forum, verdammt!

      Dieser Beitrag wurde bereits 7 mal editiert, zuletzt von „ErfinderDesRades“ ()

      kleine Vereinfachung und Korrektur:

      C#-Quellcode

      1. class SingleInstance {
      2. public static readonly SingleInstance Instance = new SingleInstance();
      3. private SingleInstance() { }
      4. }
      Deine if-Abfrage ist üflüssig, denn Instance kann überhaupt nicht null werden.
      Hingegen der private Konstruktor ist erforderlich, um zu gewährleisten, dass tatsächlich niemand von aussen diese Klasse instanzieren kann.

      Sehr lesenswert auch dieser MSDN-Artikel zum Thema: Implementing Singleton in C#

      Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „ErfinderDesRades“ ()

      Im Startpost von @Nikx wird der Singleton mit dem Lazy-Pattern kombiniert.

      Wenn man eine Property verwendet, kann man den statischen Konstruktor benutzen, um die Instanz zu erstellen:


      C#-Quellcode

      1. sealed class SingleInstance
      2. {
      3. public static SingleInstance Instance { get; private set; }
      4. static SingleInstance()
      5. {
      6. Instance = new SingleInstance();
      7. }
      8. private SingleInstance()
      9. { }
      10. }
      Das sollte man später mit Roslyn auch anders machen können, vorerst muss man bei Propertys noch explizit den statischen Konstruktor (oder ähnlich) setzen.

      Mit Lazy-Init kombiniert (wie im Startpost) sieht man häufig sowas:

      C#-Quellcode

      1. sealed class SingleInstance
      2. {
      3. private static SingleInstance _instance;
      4. public static SingleInstance Instance
      5. {
      6. get
      7. {
      8. return _instance ?? (_instance = new SingleInstance()); // Wie: _instance != null ? _instance : (_instance = new SingleInstance());
      9. }
      10. }
      11. private SingleInstance()
      12. { }
      13. }
      (IMO best practice, wenn man es Lazy braucht/will)
      Von meinem iPhone gesendet