ラムダ式の利点の 1 つは、結果が必要な場合にのみ関数を評価する必要があることです。
次の (単純な) 例では、テキスト関数はライターが存在する場合にのみ評価されます。
public static void PrintLine(Func<string> text, TextWriter writer)
{
if (writer != null)
{
writer.WriteLine(text());
}
}
残念ながら、これによりコードの使用が少し見苦しくなります。次のような定数または変数で呼び出すことはできません
PrintLine("Some text", Console.Out);
このように呼び出す必要があります:
PrintLine(() => "Some text", Console.Out);
コンパイラは、渡された定数からパラメーターなしの関数を「推測」できません。C# の将来のバージョンでこれを改善する計画はありますか、それとも何か不足していますか?
アップデート:
私は自分で汚いハックを見つけました:
public class F<T>
{
private readonly T value;
private readonly Func<T> func;
public F(T value) { this.value = value; }
public F(Func<T> func) {this.func = func; }
public static implicit operator F<T>(T value)
{
return new F<T>(value);
}
public static implicit operator F<T>(Func<T> func)
{
return new F<T>(func);
}
public T Eval()
{
return this.func != null ? this.func() : this.value;
}
}
これで、関数を次のように定義できます。
public static void PrintLine(F<string> text, TextWriter writer)
{
if (writer != null)
{
writer.WriteLine(text.Eval());
}
}
関数または値の両方で呼び出します。