gpt4 book ai didi

c#-3.0 - C# lambda 表达式和惰性求值

转载 作者:行者123 更新时间:2023-12-03 06:36:45 24 4
gpt4 key购买 nike

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# 的 future 版本中对此进行改进,还是我遗漏了某些内容?

更新:

我自己刚刚发现了一个肮脏的黑客:

    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());
}
}

并使用函数或值来调用它。

最佳答案

我怀疑 C# 会获得此功能,但是 D有它。您所概述的是在 C# 中实现惰性参数求值的合适方法,并且编译可能与 lazy 非常相似。在 D 中,以及在更纯的函数语言中。

考虑到所有因素,四个额外字符加上可选的空格,对于正在成为多范式强类型语言的清晰重载解析和表达能力来说并不是一个特别大的代价。

关于c#-3.0 - C# lambda 表达式和惰性求值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/414176/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com