Я пытаюсь понять, почему это правильная реализация паттерна Синглтон:
public sealed class Singleton : ISingleton
{
public static Singleton Instance { get; } = new Singleton();
private Singleton() { }
// methods
}
А как насчет флага beforefieldinit
? Согласно статье Джона Скита:
Ленивость инициализаторов типов гарантируется .NET только в том случае, если тип не помечен специальным флагом, называемым beforefieldinit. К сожалению, компилятор C # (по крайней мере, как это предусмотрено в среде выполнения .NET 1.1) помечает все типы, которые не имеют статического конструктора (т. Е. Блок, который выглядит как конструктор, но помечен как статический) как beforefieldinit.
Статический конструктор не нужен в новейшей версии C #?
Приведенный выше код является реализацией SystemClock
в проекте NodaTime Джоном Скитом ».
ИЗМЕНИТЬ код Джона Скита для справки (почему я упоминаю этот флаг 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;
}
}
}
beforefieldinit
, если нет статического конструктора. 21.03.2016public static Lazy<Singleton> Instance => new Lazy<Singleton>(() => new Singleton());
Итак, в C # 6 полной лени можно добиться вот так? 29.11.2017public static Lazy<Singleton> Instance { get; } = new Lazy<Singleton>(() => new Singleton());
- вам все равно может понадобиться статический конструктор, и возвратLazy<Singleton>
, а неSingleton
, вероятно, тоже не идеален. 29.11.2017