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

Pra*_*sad 105 c# lambda c#-4.0

lambda表达式_=> expr意味着什么?

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

例:

int count = 0;
list.ForEach(_ => count += 1);
Run Code Online (Sandbox Code Playgroud)

Cha*_*ion 78

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

  • 在Haskell,ML,Scala等中,`_`是模式匹配中的通配符.它基本上意味着"我不在乎,我总是*希望这个匹配".这个"我不关心"然后被带到*命名*你不关心的东西,并从那里,它溢出到其他编程语言.例如,它也在Ruby中用于表示与此示例中相同的内容,即使`_`在Ruby中绝对没有特殊意义. (9认同)
  • 它在Haskell和其他函数语言中更常见.我认为这就是它的来源. (3认同)

ang*_*son 38

它是一个参数名称,虽然不是一个有用的名称,但它是通常使用的(通过某些约定)当你需要指定表达式有一个参数以便让代码编译时,但是你并不在乎关于它,所以你只是忽略它.

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

你可以很容易地写出来:

var _ = 10;
Run Code Online (Sandbox Code Playgroud)

  • 我们可以使用 () 代替 _ 吗? (2认同)
  • 你尝试过使用它吗? (2认同)

Blu*_*eft 28

_是一个有效的变量名称.它们只是_用作变量.


vod*_*ang 9

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


小智 6

我还第二次使用了_ => _.method()单行方法调用lambda,因为它减少了指令的认知分量。特别是在使用泛型时,编写时x => x.method()只是添加了“这是什么'x'?它是空间坐标吗?”的瞬间考虑。

考虑以下情况:

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

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

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

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

最重要的是,冗长仅能为消除歧义辩解,尤其是对于lambda而言,lambdas最初是为了简化匿名代表的创建而创建的。无论如何,都应使用常识,以兼顾易读性和简洁性。如果该符号只是真实功能的“钩子”,那么一个字符标识符就可以了。对于For循环以及使用“ i”和“ j”字母作为索引器的情况就是这样。

  • Do(id =&gt; Log(id))最好缩写为`Do(Log)`。 (3认同)
  • +1 这种方法!虽然我是唯一一个在 lambdas 中使用下划线来“减少认知权重”而不是为了表明未使用此参数的人。使用下划线确实更容易阅读,特别是如果有很多链接并且您可以立即推断类型,就像 LINQ 查询的情况一样! (2认同)