C# _=>;这个下划线在Lambda表达式中是什么意思?

C# _=>;这个下划线在Lambda表达式中是什么意思?,c#,c#-4.0,lambda,C#,C# 4.0,Lambda,像\u=>expr这样的lambda表达式是什么意思 作为lambda的输入,\uu的目的是什么 例如: int count = 0; list.ForEach(_ => count += 1); 这是在不关心参数时使用的约定。\u是有效的变量名。他们只是将\uu用作变量。这是一个参数名,虽然不是一个有用的名称,但在需要指定表达式有一个参数以便编译代码时,通常会使用它(根据某些约定),但您并不真正关心它,因此您只需忽略它 它基本上利用了C#中合法标识符的语法,因为标识符可以以下划线开头,

\u=>expr
这样的lambda表达式是什么意思

作为lambda的输入,
\uu
的目的是什么

例如:

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

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

\u
是有效的变量名。他们只是将
\uu
用作变量。

这是一个参数名,虽然不是一个有用的名称,但在需要指定表达式有一个参数以便编译代码时,通常会使用它(根据某些约定),但您并不真正关心它,因此您只需忽略它

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

你可以很容易地写下:

var _ = 10;

由于lamda表达式主要用于简短的匿名代码中,因此有时不需要变量的名称,即使它们不在代码块中使用变量,因此它们只给出一个简短的约定,我也支持使用
\u=>\ uMethod()
作为一行方法调用lambdas,因为它降低了指令的认知权重。特别是在使用泛型时,编写
x=>x.method()
只需在瞬间考虑“这个‘x’是什么?它是空间中的坐标吗?”

考虑以下情况:

Initialize(=>u.Init())

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

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

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


归根结底,冗长只是为了消除歧义,特别是对于lambda,它的创建首先是为了简化匿名委托的创建。在任何情况下,都应该使用常识,平衡易读性和简洁性。如果符号只是真正功能的“挂钩”,那么一个字符的标识符就很好了。For循环和作为索引器的“i”和“j”字母就是这样。

大家好,欢迎来到StackOverflow。我冒昧地编辑了您的问题,以增加您获得有用答案的机会,希望您不介意。请注意,假设
list
IEnumerable
,他们可以(也应该)使用
sum=list.Count()我想这可以用来防止你用一个新的变量名“污染”作用域,这个变量名可能会在其他地方使用,从而导致冲突。这在Haskell和其他函数式语言中更为常见。我认为这就是它的来源。在Haskell、ML、Scala和其他语言中,
\uu
是模式匹配中的通配符。它的基本意思是“我不在乎,我一直想让它匹配”。当涉及到命名您不关心的事物时,“我不在乎”这个词就会被带到其他编程语言中。例如,它在Ruby中也被用来表示与本例相同的意思,尽管
在Ruby中绝对没有特殊意义。@JörgWMittag在2010年5月是真的,但在2010年6月不是真的。太棒了我们可以使用()来代替ux吗?你试过使用它吗?是的,我在使用lambda表达式创建线程时使用过它<代码>线程t=新线程(()=>doSomething(x,y));t、 start()我假设,\的使用是将集合的每个变量传递给lambda表达式,即使它没有被使用。但是当我们使用()时,它可能不会发生。我的意思是无参数lambda。您需要使用ForEach方法调用来尝试它。线程构造函数上有一个重载,它接受一个不接受任何参数的委托。尝试调用一个方法,比如ForEach,它接受一个代理,而该代理接受一个参数!我认为我是唯一一个在lambdas中使用下划线来“减少认知权重”的人,而不是为了表明这个参数没有被使用。使用下划线确实更容易阅读,特别是如果有很多链接,并且可以立即推断类型,就像LINQ查询一样
Do(id=>Log(id))
最好缩写为
Do(Log)