備忘録日記スマートフォン用の表示で見るスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。絡みのメモを公開しています。EnsureInitialized)C#今回は、System.LazyInitializerクラスについてちょこっとメモメモ。4.0から追加された型です。Lazyクラスと同様に、遅延初期化をサポートするためのクラスです。System.Lazyについては、前回の記事をご参照ください。race-to-initialize)http://d.hatena.ne.jp/gsf_zero1/20120717/p1LazyInitilizerクラスは、EnsureInitializedというstaticメソッドのみが公開されており前回記述したLazyの記述を簡便化するために利用できます。前回の記事にて記述しましたがLazyの場合は、以下のような記述となります。}}LazyInitializerを利用すると、以下のように記述できます。}}Lazyの場合は、フィールドをLazyで宣言し、プロパティにてそのValueを返すようにしていましたが、EnsureInitializedを利用した場合だとフィールド宣言は、そのままの状態で、値を返す前に初期化するようになっています。した感じになりますね。EnsureInitializedは、LazyThreadSafetyMode.PublicationOnlyを指定した場合と同様の動作となります。複数のスレッドが同時にアクセスした場合オブジェクトの初期化処理は、複数行われますが最初に初期化に成功した値が設定されます。(race-to-initializeパターン)以下サンプルです。Lazyでの記述を簡便化するために存在する。指定した場合と同じ動作となる。#endregion以下、実行結果です。[4]いったんどちらのスレッド(スレッドIDが3と4)も初期化に入ってきているのですが最初に初期化に成功したスレッドの値が適用されている事がわかります。後(サンプルでは2000ミリ秒ほど待機後)に、再度値を取得していますがこの段階では、遅延初期化がすんだ後なので、設定済みの値がそのまま返ってきています。クラスhttp://msdn.microsoft.com/ja-jp/library/system.threading.lazyinitializer.aspx================================過去の記事については、以下のページからご参照下さい。備忘録日記まとめhttp://sites.google.com/site/gsfzero1/サンプルコードは、以下の場所で公開しています。絡みのメモを公開しています。Blog|ブログを報告する。