Wie kann man in C# ein Singleton implementieren?
Der klassische Weg wär in etwa so, dass man ein public static field Instance hat.
Das sähe ungefähr so aus:
namespace SingletonPattern
{
public class KlassicherSingleton
{
private static KlassicherSingleton instance;
private KlassicherSingleton()
{
}
public static KlassicherSingleton Instance
{
get
{
if (instance == null)
{ instance = new KlassicherSingleton(); }
return instance;
}
}
}
}
Nachteil dieser Methode ist vor allem, dass sie nicht Thread-Safe ist. Mehrere Prozessen könnten konkurrierend sich um diese Instanz kloppen. Was am Ende raus kommt ist entweder der Weltuntergang, ein seltsamen Verhalten der Anwendung, oder sogar der Absturz ins tiefe nichts.
Man könnte nun hergehen und das Ganze mit Locks irgendwie Threadsafe basteln, aber der Entwickler ist zu faul dafür. Microsoft-Entwicklern geht es da nicht anders, also wurde das Lazy-Pattern erschaffen. Die Anwendung ist super simple:
using System;
namespace SingletonPattern
{
public class LazySingleton
{
private static Lazy<LazySingleton> instance = new Lazy<LazySingleton>(() => new LazySingleton());
/// <summary>
/// Single-Instance des CalloutEventAggregators
/// </summary>
public static LazySingleton Instance
{
get
{
return instance.Value;
}
}
}
}
Vorteil: Thread safe. Und weniger zu schreiben. WinWin für alle. Außer dem, der das Lazy schreiben musste. Aber der bekommt dafür vielleicht ja einen Kuchen.