gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 11:02:28 25 4
gpt4 key购买 nike

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/

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