像_=> expr
这样的lambda表达式是什么意思?
_
作为lambda输入的目的是什么?
示例:
int count = 0;
list.ForEach(_ => count += 1);
答案 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”字母就是索引器。