下划线在 Lambda 表达式中意味着什么?

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

What is the purpose of _ as input to lambda?

例如:

int count = 0;
list.ForEach(_ => count += 1);
29339 次浏览

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

_ is a valid variable name. They are just using _ as a variable.

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

它基本上是利用 C # 中合法标识符的语法,由于标识符可以以下划线开始,不包含任何其他内容,所以它只是一个参数名。

你完全可以写:

var _ = 10;

因为 lada 表达式主要用在一个简短的匿名代码中,所以有时候变量的名称是不必要的,即使他们不在代码块中使用变量,所以他们只是给一个简短的约定

我还支持使用 _ => _.method()来实现单行的方法调用 lambdas,因为它降低了指令的认知重量。特别是在使用泛型时,编写 x => x.method()只是增加了“这个‘ x’是什么?它是一个空间坐标吗?”.

考虑以下情况:

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

Used with a Generics call, the underscore in this case works as a "bypass symbol". It avoids redundancy, defining that the type of the argument is obvious and can be infered from usage - just as when you use 'var' to prevent repeating a type declaration. Writing client=>client.Init() here would just make the instruction longer without adding any meaning to it.

显然,这并不适用于要传递给方法的参数,这些参数应该以描述性的方式命名

当使用代码块而不是一行程序时,方法调用的单下划线参数使用是不合理的,因为 lambda 标识符与其泛型定义断开了连接。一般来说,如果要重用相同的标识符,请给它一个描述性的名称。

底线是,冗长只有在消除歧义时才是合理的,特别是对于 lambdas,它的创建首先是为了简化匿名委托的创建。在任何情况下,都应该使用常识,平衡易读性和简洁性。如果符号只是一个“钩子”到真正的功能,一个字符标识符是完全没问题的。For-loop 和“ i”和“ j”字母作为索引器就是这种情况。