c# - 在何处以不同方式调用函数之间有什么区别

标签 c# delegates lambda .net-4.5 func

private void MainForm_Load(object sender, EventArgs e)
{
     Func<int, bool> f = funn;
     var list = new List<int>();
     list.Add(32);
     list.Add(1);
     list.Add(2);
     list.Add(3);
     MessageBox.Show(list.Where(f).First().ToString());//I give only f
}
private bool funn(int k)
{
        return k == 12;
}

查看 Where 子句参数

private void MainForm_Load(object sender, EventArgs e)
{
     Func<int, bool> f = funn;
     var list = new List<int>();
     list.Add(32);
     list.Add(1);
     list.Add(2);
     list.Add(3);
     MessageBox.Show(list.Where(i=>f(i)).First().ToString());//Now I give f with i
}
private bool funn(int k)
{
        return k == 12;
}

那么,那些调用过滤方法的王者有什么区别呢?

最佳答案

该特定示例没有语义差异,因为:

Where(method)

期望method有一个签名bool method(T object),其中T是可枚举的类型,它只会为序列中的每个对象调用 method()

Where( item => method(item) )

做完全相同的事情,因为它将序列中的每个对象传递给method()

但是,如果您需要(例如)使用 item 中的某些属性来进行测试,则必须使用显式 lambda。

例如,想象一下,如果 item 有一个 Text 属性,您想要传递给 method() 您必须这样做:

Where( item => method(item.Text) )

在这种情况下,method() 将具有签名 bool method(string)

更多详情

您可以只使用方法名称而不是 lambda 委托(delegate)的原因是因为“方法组转换”。

C# 语言规范的第 6.6 节对此进行了详细介绍。简单来说,它的意思是,如果一个方法与委托(delegate)具有相同的签名,那么它可以自动转换为这样的委托(delegate)类型。

来自规范:

An implicit conversion (§6.1) exists from a method group (§7.1) to a compatible delegate type. Given a delegate type D and an expression E that is classified as a method group, an implicit conversion exists from E to D if E contains at least one method that is applicable in its normal form (§7.5.3.1) to an argument list constructed by use of the parameter types and modifiers of D, as described in the following.

(然后还有更详细的内容,我不会在这里发布!)

关于c# - 在何处以不同方式调用函数之间有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17192506/

相关文章:

c# - 如何实现通用 RepositoryFactory?

objective-c - Swift 中的 Objective C 委托(delegate)

C++ lambda 不会对按值捕获的成员调用析构函数

PHP 5.3 lambda 匿名函数不工作

lambda - 如何在 C++0x 中重载用于组合函数的运算符?

c# - 磁盘上连续的内存映射文件

c# - 如何从 ObservableCollection 中获取第一个对象?

delegates - qml ListView 中的第一个元素的行为是否不同?

c# - 如何定期将 c# FileStream 刷新到磁盘?

c# - 如何向 webform 项目添加回调