Jon Skeet предлагает in his singleton implementation что если вам нужна максимальная лень для вашего singleton, вы должны добавить статический конструктор, который заставит компилятор маркировать тип как beforefieldinit.Синтаксическая реализация лень со статическим конструктором
Тем не менее, я сделал некоторые испытания, и кажется, что он более ленив без the beforefieldinit.
Кода (частные выходы вызова конструктора утешать и проверяет, что поля были инициализированы:
public sealed class Singleton
{
private static readonly Singleton instance = new Singleton();
public static string Stub()
{
return "123";
}
// Explicit static constructor to tell C# compiler
// not to mark type as beforefieldinit
//static Singleton()
//{
//}
private Singleton()
{
Console.WriteLine("private ctor");
}
public static Singleton Instance
{
get
{
return instance;
}
}
}
Когда я называю Singleton.Stub() частный конструктор не является хитом, и когда я раскомментировать статический конструктор, частный конструктор всегда называется.
Это единственное различие, которое я мог бы трек сделал статический конструктор.
в моих попытках понять, что разница будет ли beforefieldinit сделать Я также прочитал ответ Skeet in this post попробовал его с передачей false в DoSomething() - с или без статического конструктора частный конструктор не вызывается.
public static void DoSomething(bool which)
{
if (which)
{
var a = Singleton.Stub();
}
else
{
Faketon.Stub();
}
}
Так в чем же ценность 'which' здесь? Похоже, что это, вероятно, «ложь». –
Первый пример кода не использует метод DoSomething(), я просто вызываю 'Singleton.Stub()' из Main() .. во втором примере кода, который всегда является ложным. – BornToCode
Это, вероятно, потому, что вы передаете константу методу 'DoSomething (false)', и оператор 'if' будет оптимизирован, поэтому' Singleton.Stub() 'оптимизируется/удаляется из кода. –