_ =>这个下划线在Lambda表达式中意味着什么?

时间:2010-05-06 04:02:31

标签: c# c#-4.0 lambda

_=> expr这样的lambda表达式是什么意思?

_作为lambda输入的目的是什么?

示例:

int count = 0;
list.ForEach(_ => count += 1);

5 个答案:

答案 0 :(得分:70)

这是您不关心参数时使用的约定。

答案 1 :(得分:37)

它是一个参数名称,虽然不是一个有用的参数名称,但是当您需要指定表达式具有参数以获取代码时,它是通常使用的(通过某些约定)编译,但你真的不关心它,所以你只是忽略它。

它基本上利用了C#中合法标识符构成的语法,并且由于标识符可以以下划线开头,而不包含任何其他内容,因此它只是一个参数名称。

你可以轻松写完:

var _ = 10;

答案 2 :(得分:25)

_是有效的变量名称。他们只是使用_作为变量。

答案 3 :(得分:9)

因为lamda表达式主要用在一个简短的匿名代码中,所以变量的名称有时不是必需的,即使它们不使用代码块中的变量,所以它们只是给一个_,惯例

答案 4 :(得分:4)

我还将_ => _.method()用于单行,方法调用lambdas,因为它降低了指令的认知权重。特别是在使用泛型时,写x => x.method()只是添加了对“这是什么'x'的分秒考虑?它是空间中的坐标吗?”。

考虑以下情况:

Initialize<Client> ( _=>_.Init() );

与泛型调用一起使用时,本例中的下划线用作“旁路符号”。它避免了冗余,定义了参数的类型是显而易见的并且可以从使用中产生 - 就像使用'var'来防止重复类型声明一样。在这里写client=>client.Init()只会使指令更长,而不会给它添加任何含义。

显然,这不适用于要传递给方法的参数,应该以描述性方式命名。例如:Do( id=>Log(id) );

当使用代码块而不是单行代码时,方法调用的单下划线参数用法几乎不合理,因为lambda标识符与其泛型定义断开连接。通常,当要重用相同的标识符时,请为其指定一个描述性名称。

最重要的是,冗长只对消除歧义是合理的,特别是对于lambdas而言,lambdas是为了简化匿名委托创建而创建的。无论如何,应该使用常识,平衡易读性和简洁性。如果符号只是实际功能的“钩子”,则一个字符标识符完全没问题。 For-loops就是这种情况,而“i”和“j”字母就是索引器。