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

时间:2012-05-10 17:02:53

标签: c# coding-style lambda

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

示例:

我以前写的东西:

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

我所看到的是写作:

{{1}}

7 个答案:

答案 0 :(得分:47)

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

其他资源:

答案 1 :(得分:23)

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

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

我可能会把你的例子写成:

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

我的想法是,我认为p至少在整个陈述的上下文中建议它是people记录。你可以更进一步:

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

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

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

答案 2 :(得分:17)

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

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

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

你会说什么?

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

答案 3 :(得分:5)

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

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

答案 4 :(得分:1)

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

例如:

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

答案 5 :(得分:0)

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

长篇短文 - 做适合你的事。

答案 6 :(得分:0)

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

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