Próbuję zrozumieć, dlaczego jest to poprawna implementacja wzorca Singleton:Dlaczego wdrożenie singleton w C# 6.0 nie wymaga flagi beforefieldinit?
public sealed class Singleton : ISingleton
{
public static Singleton Instance { get; } = new Singleton();
private Singleton() { }
// methods
}
co z flagą beforefieldinit
? Według Jon Skeet article:
Lenistwo typu inicjalizatorów jest zagwarantowane tylko przez .NET, gdy typ nie jest oznaczony specjalną flagę zwanego beforefieldinit. Niestety, kompilator C# (przynajmniej w środowisku wykonawczym .NET 1.1) zaznacza wszystkie typy, które nie mają statycznego konstruktora (tj. Bloku, który wygląda jak konstruktor, ale jest oznaczony statycznie) jako beforefieldinit.
Czy konstruktor statyczny nie jest potrzebny w najnowszej wersji C#?
Powyższy kod jest implementacją SystemClock
w projekcie NodaTime autorstwa Jona Skeeta. "
EDIT kod Jon Skeet odsyłające (dlaczego ja wspomnieć tę flagę beforefieldinit):
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;
}
}
}
Co z tą flagą? Nie rozumiem tego pytania. – usr
@usr zobacz edycję :) –
Istnieje wyjątkowa kwestia projektowania języka C# dla jawnego określania zachowania 'beforefieldinit': https://github.com/dotnet/roslyn/issues/4448 (fyi) – usr