C#风格:Lambdas,_ =>或x =>?

Jer*_*ell 26 c# lambda coding-style

我在C#中使用lambda表达式之前已经习惯使用lambda表达式,因此我养成了使用_简单lambda 的习惯,Func<T, TResult>,特别是对于简单的lambda,其中body只是表示返回值的表达式(谓词等) ..).但是,在C#中,我经常看到使用单个字母而不是_用于这些相同类型的lambda表达式,例如x,y,z,i,j,k.字母方法对我来说似乎很奇怪,因为这些字母在循环变量中已经具有常用的另一种典型含义._在我看来,通常更容易阅读.单字母风格真的是C#中lambdas的既定风格吗?

例子:

我以前写的东西:

var ages = people.Select(_ => _.Age);
Run Code Online (Sandbox Code Playgroud)

我所看到的是写作:

var ages = people.Select(x => x.Age); // choice of 'x' is not consistent
Run Code Online (Sandbox Code Playgroud)

sbl*_*lom 49

许多C#开发人员使用_,以表明参数是不会被使用,并且参数时,字母或其他短名称使用.

其他资源:

  • 这与许多函数式语言一致,其中`_`是一个"wlidcard模式",匹配所有内容但不绑定名称,例如在Haskell中,x的情况2 - > x`是`2`,但是`case 2 of _ - > _`是语法错误. (3认同)

Dav*_*vid 23

这是一个变量名称,所以我认为名称应该传达它需要传达的信息.什么信息确实_传达了?

为此,哪些信息确实x传达了?

我可能会这样写你的例子:

var ages = people.Select(p => p.Age);
Run Code Online (Sandbox Code Playgroud)

我的想法是,我觉得p至少在整个声明的背景下暗示它是一个people记录.你可以更进一步:

var ages = people.Select(person => person.Age);
Run Code Online (Sandbox Code Playgroud)

现在,它向读者传达了该变量实际上是什么.当然,对于这样一个小小的陈述,可以说它是过度的.我不这么认为,但这是一个偏好问题.(而不仅仅是您的偏好,而是任何必须支持此代码的人的偏好.)

对于更大,多行,复杂的lambda表达式,名称变得更加重要.距离变量意味着的上下文越远,变量的名称就越需要携带该变量的上下文.

  • 当然,您正在编写(_,__)=> {notificationEventHandler();}的被丢弃参数的情况(例如,对于匿名事件处理程序)是我继续看到(并支持)使用下划线的情况 - 只有名字. (6认同)
  • @TetsujinnoOni:当然。在这种情况下,变量是非变量。它需要传达的唯一信息是“我什么都不是,不要利用我”。 (2认同)

Ser*_*rvy 17

lambda函数如何与其他任何方法如此不同.如果有人使用以下方法发布代码:

public static int getAge(Person _)
{
  return _.Age;
}
Run Code Online (Sandbox Code Playgroud)

要么

public static int getAge(Person x)
{
  return x.Age;
}
Run Code Online (Sandbox Code Playgroud)

你打算说什么?

在我看来,选择lambda参数的名称应该与任何其他方法的参数一样有意义.我可能会偶尔为身份函数设置异常,x => x因为在这种情况下变量不需要任何意义,它实际上可以是任何东西,但在我的脑海中使用下划线或单个字母只会使代码更不易读.(很多人都认为LINQ/Lambdas的优点是可读性,如果你混淆所有变量就会失败.)

  • 对于一个简短的方法,我完全会说P很有意义.形式化就是噪音. (6认同)
  • 赞成良好的视角转变 (2认同)
  • 有什么不同 - 当然的范围和规模.毕竟,这就是lambdas存在*的原因.这足以修改惯例. (2认同)

Dan*_*rod 5

或者您可以使用有意义的名称,例如

var ages = people.Select(person => person.Age);
Run Code Online (Sandbox Code Playgroud)