C# - Singleton-Muster
Wie Ihr sehen könnt, ist mein Spitzname, ich bin Neuling eigentlich lernen über das Singleton-Muster, habe ich ein problem. Bevor ich gelernt habe, dass statische Konstruktoren werden immer ausgeführt, bevor der standard-Konstruktoren, aber in diesem code das Ergebnis ist anders, ersten sehe ich die "Insta" string-dann wird das "Statische", warum ist es passiert ?
sealed class Singleton
{
private static readonly Singleton instance;
private Singleton()
{
Console.WriteLine("Insta");
}
static Singleton()
{
instance = new Singleton();
Console.WriteLine("Static");
}
public static Singleton Instance
{
get
{
return instance;
}
}
}
class Program
{
static void Main()
{
Singleton s1 = Singleton.Instance;
}
}
- Verwandte: csharpindepth.com/Articles/General/Singleton.aspx
- Nicht sicher über die Argumentation Ihrer Erwartung - "static-Konstruktor zuerst aufgerufen" bedeutet nicht "alle code in static-Konstruktor auf Magische Weise ausgeführt, bevor alle Anrufe an die Schüler" (Instanz-Konstruktor in deinem Fall).
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie schreiben,
würden Sie sehen, was Sie erwarten
statische ctor ausgeführt wird zunächst, wie erwartet, aber Sie drucken auf der Konsole nach die
instance = new Singleton();
Linie, aber diese Zeile ausführen Instanz ctor, also ist "inst".Sodass die Ausführung Durchfluss:
instance = new Singleton();
Sehen die MSDN-Muster hier für eine Qualität, die Erklärung des singleton-Musters.
MSDN empfiehlt Sie schreiben sollte es da unten so ist thread-sicher:
Durch die Art und Weise, dieses Muster hat folgenden Vorteil gegenüber der statischen Konstruktor:
Die Instanziierung erfolgt erst ein Objekt aufgefordert, einen Instanz; diese Vorgehensweise bezeichnet man als lazy instantiation. Verzögerte Instanziierung vermeidet unnötige Instanziierung singletons, wenn die Anwendung gestartet wird.
Sehen, wenn diese Ihre Füße brauchen, und wenn ja, diese Lösung implementieren.
Der statischen Methode wird zuerst aufgerufen. Hier ist der Beweis--ändern Sie Ihren code wie folgt: