2011年05月12日
川俣晶の縁側ソフトウェア技術雑記total 7709 count

C#で遅延初期化するLazyInitializerクラス

Written By: 川俣 晶連絡先

 実はLazy<T>を調べたのは寄り道。最初に目に付いたのはこっちの方です。LazyInitializerクラスです。これも遅延初期化用のクラスですが、明示的な初期化に使います。

サンプルソース §

using System;

using System.Threading;

class Sample

{

    public string Message;

    public Sample()

    {

        Message = "Created on " + DateTime.Now;

    }

}

class Program

{

    private static void dump( Sample sample )

    {

        if( sample == null ) Console.WriteLine("sample not initialized");

        else Console.WriteLine(sample.Message);

    }

    static void Main(string[] args)

    {

        Sample sample = null;

        dump(sample);

        LazyInitializer.EnsureInitialized(ref sample);

        dump(sample);

    }

}

実行結果 §

sample not initialized

Created on 2011/05/12 9:35:22

解説 §

 LazyInitializer.EnsureInitializedメソッドを使うと以下のような特徴のある初期化ができます。

  • null値の変数を、引数の無いコンストラクタで初期化してくれる
  • バリエーションで、初期化が実行されたかを示す値を受け取れる
  • バリエーションで、マルチスレッドでロックするためのオブジェクトを渡せる
  • 初期化の実行は明示的であり、Lazy<T>クラスのように使ったら自動的に初期化してくれるわけではない
  • 初期化は必ず1回だけ実行される。既に初期化済みなら重ねて初期化しない

感想 §

 結局、位置づけはSystem.Threading名前空間にあることから明瞭ですね。ロックオブジェクトを渡して、排他制御しながら確実に遅延初期化するためのメソッドでしょう。複数のスレッドからこのメソッドを呼んでもコンストラクタは一回しか走りません。どのスレッドから初期化する場合でもこれを呼べば確実に初期化されます。

Facebook

キーワード【 川俣晶の縁側ソフトウェア技術雑記
【技術雑記】の次のコンテンツ
2011年
05月
14日
4値論理型は実在するか
3days 0 count
total 6949 count
【技術雑記】の前のコンテンツ
2011年
05月
11日
感想「クラウド コンピューティングEXPO【春】」
3days 0 count
total 7568 count

このサイト内の関連コンテンツ リスト

2011年
05月
10日
C#で遅延初期化するLazy<T>クラス
3days 0 count
total 9832 count

このコンテンツを書いた川俣 晶へメッセージを送る

[メッセージ送信フォームを利用する]

メッセージ送信フォームを利用することで、川俣 晶に対してメッセージを送ることができます。

この機能は、100%確実に川俣 晶へメッセージを伝達するものではなく、また、確実に川俣 晶よりの返事を得られるものではないことにご注意ください。

このコンテンツへトラックバックするためのURL

http://mag.autumn.org/tb.aspx/20110512095750
サイトの表紙【技術雑記】の表紙【技術雑記】のコンテンツ全リスト 【技術雑記】の入手全リスト 【技術雑記】のRSS1.0形式の情報このサイトの全キーワードリスト 印刷用ページ

管理者: 川俣 晶連絡先

Powered by MagSite2 Version 0.36 (Alpha-Test) Copyright (c) 2004-2021 Pie Dey.Co.,Ltd.