Przechodziłem przez następującą implementację Singleton wymienioną here. Rozumiem, że konstruktory statyczne są wykonywane przed pierwszym wywołaniem metody statycznej lub przed utworzeniem obiektu te, ale nie rozumiałem jego użycia tutaj (nawet z komentarzy). Czy ktokolwiek mógłby mi pomóc to zrozumieć?Implementacja Singleton z pustym konstruktorem statycznym
public sealed class Singleton
{
private static readonly Singleton instance = new Singleton();
// Explicit static constructor to tell C# compiler
// not to mark type as beforefieldinit
static Singleton()
{
}
private Singleton()
{
}
public static Singleton Instance
{
get
{
return instance;
}
}
}
Zostało to wyjaśnione w punktach poniżej, w szczególności: 'Lenistwo inicjatorów typu jest gwarantowane tylko przez .NET, gdy typ nie jest oznaczony specjalną flagą o nazwie" beforefieldinit ". Niestety, kompilator C# (przynajmniej w środowisku .NET 1.1) zaznacza wszystkie typy, które nie mają statycznego konstruktora (tj. Bloku, który wygląda jak konstruktor, ale jest oznaczony jako statyczny) jako "beforefieldinit". , chce, aby 'nowy Singleton()' został skonstruowany tak późno, jak to możliwe (leniwie), a jedynym sposobem na uzyskanie kompilatora C#, aby to zrobić, jest zapewnienie pustego konstruktora statycznego. – porges
Przebacz mojej niewiedzy. Czym jest "lenistwo inicjatorów typu". Jest inicjalizacja na pierwsze żądanie? – Nemo
Dokładnie. Gwarantuje to tylko taka sytuacja, w przeciwnym razie środowisko wykonawcze może uruchamiać inicjalizatory typów, kiedy tylko tego chce, na przykład po załadowaniu typu. Aby uzyskać dłuższe wyjaśnienie, patrz link w odpowiedzi Jaya. – porges