【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");
}
}