Jon Skeetは、singletonの最大の怠惰が必要な場合は、コンパイラにbeforefieldinitとしてマークするような静的コンストラクタを追加する必要があることを示唆しています。スタティックコンストラクタを使用したシングルトン実装の怠惰
しかし、私はいくつかのテストを行いました。それはなしで、 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を読んでDoSomething()にfalseを渡してみました。静的コンストラクタの有無にかかわらず、プライベートコンストラクタは呼び出されていません。
public static void DoSomething(bool which)
{
if (which)
{
var a = Singleton.Stub();
}
else
{
Faketon.Stub();
}
}
ここで 'which'の値は何ですか?おそらく 'false'のように聞こえます。 –
最初のコードサンプルはDoSomething()メソッドを使用していません。私は、単にfalseである2番目のコードサンプルのMain()..から 'Singleton.Stub()'を呼び出します。 – BornToCode
これはおそらく 'DoSomething(false)'メソッドに定数を渡し、 'if'ステートメントが最適化され、' Singleton.Stub() 'がコードから最適化/削除されたためです。 –