在哪里调用功能有什么区别?

时间:2013-06-19 13:28:46

标签: 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;
}

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

1 个答案:

答案 0 :(得分:2)

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

Where(method)

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

Where( item => method(item) )

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

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

例如,假设item有一个Text属性,您希望传递给method(),您必须这样做:

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

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

更多详情

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

C#语言规范的第6.6节详细介绍了这一点。为了简化,它意味着如果一个方法与委托具有相同的签名,它可以自动转换为这样的委托类型。

来自规范:

  

从方法组(第7.1节)到兼容的委托类型存在隐式转换(第6.1节)。给定委托类型D和被分类为方法组的表达式E,如果E包含至少一个以其正常形式(第7.5.3.1节)适用于构造的参数列表的方法,则存在从E到D的隐式转换通过使用D的参数类型和修饰符,如下所述。

(然后它继续更详细,我不会在这里发布!)