lambda 表达式的一个优点是您必须仅在需要函数结果时才对函数求值。
在以下(简单)示例中,仅在编写者存在时才评估文本函数:
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());
}
}
并用函数或值调用它。