C#でレイジー初期化を実行する方法

レイジー初期化は、オブジェクトが最初に必要になるまでオブジェクトの作成を延期する手法です。つまり、オブジェクトの初期化はオンデマンドでのみ行われます。レイジー初期化とレイジーインスタンス化という用語は同じ意味であることに注意してください。これらは同じ意味で使用できます。遅延初期化を利用することで、不要な計算やメモリ消費を回避して、アプリケーションのパフォーマンスを向上させることができます。この記事では、C#でレイジー初期化を実行する方法を見ていきます。

簡単な例で遅延読み込みを理解しましょう。2つのクラスとCustomerを考えてみましょうOrderCustomerクラスが含まれているOrders順番でのインスタンスのコレクション参照することプロパティOrderクラスを。Ordersコレクションは、大量のデータを含むことができ、さらにはデータベースに接続し、レコードを取得するために、データベース接続が必要な場合があります。このような場合、データがOrders必要になるまで、プロパティにデータをロードしても意味がありません。レイジー初期化ではOrders、データが要求された場合にのみコレクションをロードできます。

C#でLazyクラスを使用する

遅延初期化を実装する独自のカスタムコードを作成することもできますが、Lazy代わりにクラスを使用することをお勧めします。C#LazySystem名前空間のクラスは、レイジー初期化を実装するためのスレッドセーフな方法を提供するために.Net Framework4.0の一部として導入されました。このクラスを利用して、アプリケーション内のリソースを大量に消費するオブジェクトの初期化を延期できます。

Lazyクラスを使用するときは、type引数で遅延して作成するオブジェクトのタイプを指定する必要があります。Lazy.Valueプロパティにアクセスすると、遅延初期化が発生することに注意してください。Lazyクラスの使用方法の例を次に示します。

怠惰
   
     注文=新しいレイジー
    
     ();
     

IEnumerable結果= lazyOrders.Value;

今、2つのクラスを検討し、AuthorそしてBlog。作成者は多くのブログ投稿を書くことができるため、以下のコードスニペットに示すように、クラスAuthorBlogクラスの間には1対多の関係があります。

パブリッククラス作成者

    {{

        public int Id {get; セットする; }

        public string FirstName {get; セットする; }

        パブリック文字列LastName {get; セットする; }

        パブリック文字列アドレス{取得; セットする; }

        パブリックリストブログ{取得; セットする; }

    }

    パブリッククラスのブログ

    {{

        public int Id {get; セットする; }

        パブリック文字列タイトル{取得; セットする; }

        public DateTime PublicationDate {get; セットする; }

    }

AuthorBlogクラス間の1対多の関係は、クラスList内の(タイプのBlog)プロパティを使用して表されていることに注意してくださいAuthor。このプロパティを使用すると、Authorクラスはクラスの1つ以上のインスタンスのコレクションを保持できますBlog

ここで、作成者の詳細(名、姓、住所)のみをユーザーインターフェイスに表示する必要があるとします。この場合、作成者のブログの詳細をロードしても意味がありません。ブログの詳細を怠惰にロードしたいと思います。これは、Authorこのニーズに対応する更新されたクラスです。Lazyクラスの使用法に注意してください。

パブリッククラス作成者

    {{

        public int Id {get; セットする; }

        public string FirstName {get; セットする; }

        パブリック文字列LastName {get; セットする; }

        パブリック文字列アドレス{取得; セットする; }

        パブリックレイジー ブログ=>新しいレイジー (()=> GetBlogDetailsForAuthor(this.Id));

        プライベートIListGetBlogDetailsForAuthor(int Id)

        {{

       //ここにコードを記述して、作成者のすべてのブログの詳細を取得します。

        }

    }

C#で汎用のLazyクラスを使用する

ここで、ジェネリックLazyクラスを利用してシングルトンデザインパターンを実装する方法を見てみましょう。(シングルトンデザインパターンに関する私の記事はここで読むことができます。)次のバージョンのStateManagerクラスはスレッドセーフです。同時に、それは怠惰な初期化を示しています。C#コンパイラが型をとしてマークしないようにするために、明示的な静的コンストラクタが使用されていることに注意してくださいbeforefieldinit

パブリックシールクラスStateManager

    {{

        プライベートStateManager()

        {{

        }

        public staticStateManagerインスタンス

        {{

            取得する

            {{

                Nested.objを返します。

            }

        }

        プライベートクラスネスト

        {{

            静的Nested()

            {{

            }

            内部静的読み取り専用StateManagerobj = new StateManager();

        }

    }

これは、StateManagerクラスを活用するLazyクラスの遅延実装です。Lazyクラスが怠惰の実装を本当に簡単にする方法を見ることができます。 

パブリッククラスStateManager

    {{

        プライベート静的読み取り専用Lazyobj = new Lazy(()=> new StateManager());

        プライベートStateManager(){}

        public staticStateManagerインスタンス

        {{

            取得する

            {{

                obj.Valueを返します。

            }

        }

    }

上記InstanceStateManagerクラスのプロパティを見てください。Value上記のコード例に表示されているプロパティは読み取り専用であることに注意してください。そのため、セットアクセサーはありません。

レイジー初期化は優れたパフォーマンス最適化手法であり、CPUとメモリのリソースを大量に消費するオブジェクトの初期化を、絶対に必要になるまで延期できます。遅延初期化を利用して、アプリのパフォーマンスを向上させます。