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/