gpt4 book ai didi

没有变量/参数声明的 C# lambda 表达式?

转载 作者:可可西里 更新时间:2023-11-01 08:50:52 26 4
gpt4 key购买 nike

当一个方法以lambda表达式为参数时,它调用了什么,比如Enumerable.Where , 是在没有实际声明表达式中的变量或方法参数的情况下被调用的?

例如,我熟悉这个 lambda 表达式语法:

public string GetDigits(string input)
{
return new String(input.Where(i => Char.IsDigit(i)).ToArray());
}

然而,令我惊讶的是find out这也可以写成:

public string GetDigits(string input)
{
return new String(input.Where(Char.IsDigit).ToArray());
}

在第二个代码段中发生了什么,其中 Char.IsDigit() 方法(显然)是使用隐式参数调用的?这个语法叫什么?

最佳答案

方法不接受lambdas 作为参数。他们接受委托(delegate)作为参数。 lambda 只是创建委托(delegate)的一种方式。

另一种方法是提供一个方法组,就像在您的第二个示例中所做的那样,它可以转换为委托(delegate)。

类似的方法是使用匿名方法特性。不过,在添加它们时,它或多或少地被 lambdas 取代了,所以你看不到它。您使用该语法的示例是:

Func<char, bool> predicate = delegate(char c) { return Char.IsDigit(c); };

另一种方法是使用 Delegate.CreateDelegate 创建委托(delegate)。 (虽然这不是您经常看到的东西。)

最后一种方法是使用从其他地方获得的委托(delegate)变量。 (其他地方会使用这些其他选项之一创建委托(delegate)。)

What's going on in that second snippet, where the Char.IsDigit() method is (apparently) being called with an implicit parameter? What is this syntax called?

没有被调用。这就是重点。我们正在尝试创建一个委托(delegate)。委托(delegate)是一个对象,它跟踪要调用的方法,以及应该调用它的对象。然后您可以调用该委托(delegate),它将调用用于创建它的方法。所以这里您不是调用IsDigit,您正在创建一个指向IsDigit 方法的委托(delegate),它会在任何时候调用它该委托(delegate)被调用。

当您使用 lambda 时,您正在创建一个新方法,可能在一个新类中,(它们都没有可以引用的名称,但它们在运行时会有一个)和该匿名方法的主体将调用 IsDigit。然后,lambda 解析为指向该匿名方法的委托(delegate),该委托(delegate)维护另一个示例的语义,即在调用时调用匿名方法的方法,在其实现中调用 IsDigit。它添加了一个额外的间接层(可能会或可能不会在运行时优化)来完成同样的事情。

关于没有变量/参数声明的 C# lambda 表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30895055/

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