きな粉もち.net

.NET関連仕事に携わっています。OSSのソースを読んで気がついたことを中心に呟いたりブログに投稿したりしています。最近はUiPathを使ったRPAも研究中。気軽にフォローやツッコミよろしくおねがいします! Gitはここを使っています https://github.com/kinakomotitti

C# × Lazy × どうやって使うのか調べてみた

この記事の目的

この記事では、
Lazyを使った実装についてまとめること
を目的としています。

本題

★夏休み課題
  • Repositoryパターン関連
  • Linqを使ったデータの操作
    • Where
  • Lazy クラスの使い方←【ここ】
  • Unity
    • HelloWorld
    • UI作成
    • 画面遷移
    • あといろいろ
★はじめに

とあるTwitterとQiita記事をきっかけに、C#のLazyクラスのことを知りました。
そこで、今回は、C#の師匠として使わせていただいている「プログラミング.NET Framework 第4版」の「Lazyに関する部分」を読んで学んだことをアウトプットしています。

プログラミング.NET Framework 第4版 (Microsoft Press)

プログラミング.NET Framework 第4版 (Microsoft Press)

★Lazyとは

インスタンスの初期化処理を遅延させます。遅延ってイメージしにくいですが、初めて使用されるまでオブジェクトの作成が延期されることを意味します。このクラスを使う目的は主に、パフォーマンスの改善、無駄な計算処理の回避、プログラムのメモリ要件の縮小です。

公式ドキュメントの場所
https://docs.microsoft.com/ja-jp/dotnet/framework/performance/lazy-initialization

★実装例

師匠で紹介されていたコードをベースに使い方を学んでいきます。

public void LazySample()
 {
     //1)public Lazy(Func<T> valueFactory)を使ってインスタンス生成時の処理を定義
     Lazy<String> lazy = new Lazy<string>(()=>
     {
         //インスタンス化された時(必要とされた時)の時間をString型で保持する。
         return DateTime.Now.ToLongDateString();
     });
 
     //2)インスタンスが生成されたかを確認(IsValueCreatedがTrueなら生成済み)
     Console.WriteLine(lazy.IsValueCreated); //ここではFalseとなる
 
     //3)値を問い合わせる
     //  最初のアクセスで、ラップされた型(ここではString)が作成され、返され、今後のアクセスのために保存される
     //  また、Value プロパティは読み取り専用
     Console.WriteLine(lazy.Value);
 
     //4)インスタンスが生成されたかを確認(IsValueCreatedがTrueなら生成済み)
     Console.WriteLine(lazy.IsValueCreated);//ここではtrueとなる
 
     System.Threading.Thread.Sleep(10000);
     //5)既に生成済みのインスタンスに対しての値問い合わせなので、3)と同じ値が返ってくる
     Console.WriteLine(lazy.Value);
 }

Valueプロパティにアクセスするまでは、インスタンス化されないので、メモリを節約することができるということがよくわかります。

まとめ

Lasyクラスは、アプリ起動時に設定ファイルを読み込み、保持するような部品のように、必要とされるまではインスタンス化しない方がメモリを節約できるものに利用することで効果を発揮するもの。アプリの基盤や共通部品を作成する際には意識しておきたいものですね。