28

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

例子:

我习惯写的:

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

我看到的是写的:

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

7 回答 7

53

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

其他资源:

于 2012-05-10T17:04:41.157 回答
25

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

为此,x传达了什么信息?

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

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

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

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

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

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

于 2012-05-10T17:08:28.160 回答
17

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

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

或者

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

你打算说什么?

在我看来,为 lambda 选择参数的名称应该与任何其他方法的参数一样有意义。我可能会偶尔为标识函数设置例外,x => x因为在这种情况下,变量不需要表示任何含义,它实际上可以是任何东西,但是在我脑海中对所有内容使用下划线或单个字母只会使代码的可读性大大降低. (很多人吹捧 LINQ/Lambdas 的优点是可读性,如果你混淆所有变量,它就会被打败。)

于 2012-05-10T17:20:21.993 回答
5

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

var ages = people.Select(person => person.Age);
于 2012-05-10T17:06:29.077 回答
1

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

前任:

var personList = (from person in people  where person.Age > 18  select person).ToList();
于 2012-05-11T07:35:14.957 回答
0

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

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

于 2012-05-10T17:05:10.223 回答
0

你可以给它一个名字是有原因的——因为有时你可以有多个输入并且需要区分它们:

Func<int,int,int> product = (num1, num2) => (num1 * num2);  // takes in two ints, and returns one int
int x = product(2, 3);  
于 2012-05-10T17:12:47.830 回答