2015-09-23 21 views
5

新しいC#6では、これらのきれいな自動プロパティ初期化子が得られました。私は、これまで以上に簡潔なシングルトンを作るために、これらの利点を活用することもできると考えました。明らかにsomeone elseもそのアイデアを得ました。自動プロパティ初期化子シングルトン実装

public sealed class Singleton 
{ 
    public static Singleton Instance { get; } = new Singleton(); 
    private Singleton() { /* some initialization code */ } 
} 

私の質問は以下のとおりです。

  1. それがどのようにスレッドセーフ?
  2. インスタンスが実際に作成されるか、どれほど怠惰ですか? (優先度は高くはありませんが、今後の参考になると良いでしょう)
  3. 全体的に良いアイデアですか?

(それはthis questionに似て見えるかもしれませんが、それはありません)

答えて

6

あなたのコードは次のように展開されます。

public sealed class Singleton 
{ 
    private static readonly Singleton <Instance>k__BackingField = new Singleton(); 
    public static Singleton Instance { get { return <Instance>k__BackingField; } } 
    private Singleton() { /* some initialization code */ } 
} 

<Instance>k__BackingFieldは、コンパイラが生成したフィールドのunspeakable nameです。 )

したがって、コードのプロパティは上記のコードとまったく同じになります。つまり、このパターンはスレッドセーフであり、状況によっては良いアイデアになる可能性があります。

Instanceにアクセスする前にこのタイプの他の静的メンバーにアクセスしていないと仮定すると、正確な怠惰度はランタイムによって異なります。一般的には、 "アクセスInstanceにアクセスできるメソッドを初めてインスタンスが作成された"というようなものですが、これについての保証はありません。

Instanceが初めてアクセスされる直前にインスタンスが作成されていることを確認する場合は、空の静的コンストラクタをクラスに追加します。 (これはパフォーマンスにマイナスの影響を与える可能性がありますが、それはおそらくあなたにとって重要ではありません)。

これのほとんどはC#6に固有のものではないため、詳しい情報はJon Skeetの記事をご覧くださいsingletonsおよびstatic constructors/type initializers

関連する問題