我在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}}
答案 0 :(得分:47)
答案 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);