Was ist der Unterschied in dieser Hinsicht von der statischen Instanz für einen Singleton zu schaffen?

StackOverflow https://stackoverflow.com/questions/217932

  •  03-07-2019
  •  | 
  •  

Frage

Ich habe einen Fehler hatte vor kurzem, dass nur selbst manifestiert, wenn die Bibliothek als Release-Build gebaut wurde eher als ein Debug-Build. Die Bibliothek ist ein .NET-DLL mit einem COM-Wrapper und ich bin mit CoCreateInstance eine Klasse aus der DLL in einem nicht verwalteten c ++ App zu erstellen. Wenn ich den Fehler schließlich aufgespürt wurde es durch ein Singleton-Objekt zugreifen. Ich hatte die Singleton-Instanz erklärte wie folgt:

private static readonly MyObjectType s_instance = new MyObjectType;

und dann zugegriffen es mit:

public static MyObjectType Instance 
    { 
        get 
        {                               
            return s_instance; 
        } 
    } 

diese versagt. Ändern Sie es an:

private static MyObjectType s_instance;

public static MyObjectType Instance 
    { 
        get 
        {               
            if (s_instance==null) 
            { 
                s_instance = new MyObjectType(); 
            } 
            return s_instance; 
        } 
    } 

das Problem behoben. Irgendwelche Ideen, warum die ursprüngliche Nutzung funktionierten nicht, und wenn es irgendwelche Nachteile, um es so oder so zu tun?

Die Freigabe dll schien perfekt geeignet von anderen verwalteten App zu sein.

War es hilfreich?

Lösung

Versuchen Sie, ein (leeres) statisches Konstruktor hinzufügen oder den Singleton initialisieren in ein statischen Konstruktor.

Jon Skeet hat eine vollständige Diskussion von Singleton Muster hier . Ich bin mir nicht sicher, warum es fehlgeschlagen ist, aber eine Vermutung an die „beforefieldinit“ -Kennzeichen in Zusammenhang stehen könnte. Siehe sein viertes Beispiel, wo er einen statischen Konstruktor fügt diesen Flag zwicken. Ich behaupte nicht, ein Experte für beforefieldinit zu sein, aber dieses Symptom scheint einige der Symptome besprochen

Andere Tipps

Just bekräftigt, was Marc GRA sagte, aber es klingt viel wie ein beforefieldinit Problem, das bedeutet, dass der leere statische Konstruktor ist Ihre Lösung. Sie müssen jede und alle Konstrukteure in der Klasse zu schreiben, eine endgültige Antwort zu erhalten.

Das zweite Verfahren hat den Vorteil, träges Laden (wo das ist von Vorteil).

scroll top