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

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

例子:

我以前写的东西:

 var ages = people.Select(_ => _.Age); 

我所看到的是写作:

 var ages = people.Select(x => x.Age); // choice of 'x' is not consistent 

许多C#开发人员使用_来表示在使用参数时不会使用该参数以及字母或其他短名称。

其他资源:

  • 关于使用_而不是()有趣讨论

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

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

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

 var ages = people.Select(p => p.Age); 

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

 var ages = people.Select(person => person.Age); 

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

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

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

 public static int getAge(Person _) { return _.Age; } 

要么

 public static int getAge(Person x) { return x.Age; } 

你打算说什么?

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

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

 var ages = people.Select(person => person.Age); 

在C#中, _用于类(属性)变量, _不用于局部变量。 因此,对局部变量和类变量使用有意义的名称是很好的。

例如:

 var personList = (from person in people where person.Age > 18 select person).ToList(); 

命名lambda变量没有’既定’风格。 但是,下划线通常表示某种实例成员变量,这意味着与普通变量名称相比,您的样式可能与其他命名标准冲突。

长话短说 – 做对你有用的事情。

有一个原因可以为它命名 – 因为有时你可以有多个输入并需要区分它们:

 Func product = (num1, num2) => (num1 * num2); // takes in two ints, and returns one int int x = product(2, 3);