【C#】Lazy

Lazy<T>

初期化はコストがかかる作業。⇒必要になったときに準備できれば良い。
Lazyは初期化遅延で、オブジェクトが初めて使用されるまで、作成が延期される。
internal class Lazy101
{
  Lazy<Dictionary<int, string>> lIdStrs = new Lazy<Dictionary<int, string>>(() => new());

  internal  void Exec()
  {
    Console.WriteLine(this.lIdStrs.IsValueCreated); // false
    var val = this.lIdStrs.Value;
    Console.WriteLine(this.lIdStrs.IsValueCreated); // true
  }
}

インスタンス変数を使用

internal class UseByLazy
{
  private string? Str;
  
  internal UseByLazy(){}
  
  internal UseByLazy(string str)
  {
    this.Str = str;
  }
  
  internal void SetStr(string str) => this.Str = str;
  
  internal string GetStr() => this.Str;
} 
  
internal class UseLazy
{
  private string Str;
  // error
  // internal Lazy<UseByLazy> UseByLazy1 = new(() => new(this.Str));
  internal Lazy<UseByLazy> UseByLazy1;
  internal Lazy<UseByLazy> UseByLazy2 = new(() => new());
  
  internal UseLazy(string str)
  {
    this.Str = str;
    this.UsebyLazy1 = new(() => new(this.Str));
  }
  
  internal string GetLazy1Str() => this.UseByLazy1.Value.GetStr();
  
  internal string GetLazy2Str()
  {
    this.InitLazy2();
    return this.UseByLazy2.Value.GetStr();
  }
  
  private void InitLazy2()
  {
    if (this.UseByLazy2.IsValueCreated) return;
    this.UseByLazy2.Value.SetStr("Init");
  }
  
}