关于c#:如何在.Net中的lambda表达式中发音“ =>”

How do I pronounce “=>” as used in lambda expressions in .Net

我很少遇到其他程序员!

当我第一次看到令牌时,我的想法是"暗示",因为这就是它在数学证明中的读法,但显然不是它的意义。

因此,我该如何说或读" =>",如:

1
IEnumerable<Person> Adults = people.Where(p => p.Age > 16)

还是什至有一种同意的说法?


在阅读该运算符时,我通常会说"诸如此类"。

在您的示例中,p => p.Age> 16读为" P,因此p.Age大于16"。

实际上,我在linq正式发布前论坛上曾问过这个问题,Anders Hejlsberg回答说

I usually read the => operator as"becomes" or"for which". For example,
Func f = x => x * 2;
Func test = c => c.City =="London";
reads as"x becomes x * 2" and"c for which c.City equals London"

至于"去"-这对我来说从来没有道理。 'p'不会去任何地方。

在通过电话向某人读取代码的情况下,只要他们是C#程序员,我就只使用" lambda"一词-也就是说," p lambda p点年龄大于-十六。"

史蒂夫·杰索普(Steve Jessop)在评论中提到了转换时的"映射到"-因此以安德斯(Anders)为例:

1
x => x * 2;

会读

x maps to x times 2.

在这种情况下,这似乎比"成为"更接近代码的实际意图。


从MSDN:

All lambda expressions use the lambda
operator =>, which is read as"goes
to".


通过电话阅读代码

从埃里克·利珀特(Eric Lippert):

我个人会说c => c + 1为"看得见加一"。我听说过一些变化:

对于投影,(客户c)=> c.Name:"客户看到变成看到点名称"

对于谓词,(客户c)=> c.Age> 21:"客户看到的点年龄大于21"


我一直称其为" wang运算符" :-)

" p wang p的年龄大于16"


我使用" goes to"(去),因为一本LINQ书告诉我:)


我见过人们说"箭头"。


"映射到"怎么样?它既简洁又可以说在技术上更准确(即,不建议像"去"或"成为"那样改变状态,不对集合及其特征函数(如"使"或"为此"进行混合))其他选择。尽管如果MSDN页面似乎已经暗示了一个标准,那么也许您应该使用它(至少对于C#代码而言)。


" maps to"是我的首选发音。从数学上讲,一个函数将其参数"映射"为其返回值(甚至可以称该函数为"映射"),因此在编程中,尤其是在函数编程(尤其是lambda演算)中使用此术语对我来说是有意义的与数学非常接近。它也比"成为","进入"等更为中立,因为它不建议状态改变,如contextfree所述。


如果您将lambda表达式想象成它的匿名方法,那么"转到"就足够了。

1
(n => n == String.Empty)

n"转到"表达式n == String.Empty。

它转到匿名方法,因此您不必转到代码中的方法!

抱歉

老实说,我不喜欢在头脑中使用" goes to",但是我看到其他人说这看起来很奇怪,我想我会澄清的。


我的简短回答是:" c'lambda-of'e"。尽管我坚持使用"'lambda'c'function'e",但我认为lambda-of是普遍的折衷方案。分析如下。

如果仅是奇怪的答案,这是一个很大的问题。除lambda表达式外,大多数翻译都具有其他含义,从而导致异国情调的解释。作为一个老的lambda表达式黑客,我只是忽略了.NET表示法,而是将其重写为lambda在我的脑海中,希望他们为此做了几乎其他任何事情。

为了通过电话叙述代码,您希望某人能够按顺序写下代码。当然,这是一个问题,但是lambda-arrow或某些东西可能是您可以获得的最佳选择,或者lambda-in,但是lambda-of是最准确的。

问题在于infix的用法,以及如何在infix位置说出可以使用的东西命名整个事物以及左右部分的作用。

这可能是一个过度约束的问题!

我不会使用" such that",因为这意味着右侧是左侧应满足的谓词。这与谈论将左侧抽象为功能参数的右侧截然不同。 (MSDN关于"所有lambda表达式"的声明只是令人反感而且不准确。)

尽管"尽力而为"可能使我们感到非常接近,但有些事情却使他们感到愤怒。"转到"表示转换,但是并没有确切的变量c传递给c中的表达式。函数的抽象有点难以捉摸。我可能已经习惯了这一点,但是我仍然渴望着一些强调变量抽象的东西。

由于到目前为止,在所有情况下左侧都是一个简单的标识符[但是请等待以后可能会混淆的扩展名],我认为对于" c => expression",我会读为" c'lambda-function'expression"或" c'arg''function'表达式"。在最后一种情况下,我可以说诸如" b'arg'c'arg''function'表达式"之类的东西。

最好是更清楚地引入了lambda表达式,并说类似"'arg'b'arg'c'function'表达式"之类的内容。

弄清楚如何将所有这些翻译成其他语言是学生[; <)的练习。

我仍然担心"(b,c)=>表达式"和其他尚未出现的变体。也许是"'args'b,c'function'表达式"。

经过所有这些思考之后,我注意到我正在将" c => e"翻译为"'lambda'c'function'e",并注意到要通过上下文理解到精确形式的映射:λc(e ),c => e,f其中f(c)= e等

我希望" goes-to"解释会流行,因为这是占主导地位的多数人第一次看到lambda表达式的地方。太可惜了。一个很好的折衷方案可能是" c'lambda-of'e"


我没有想太多,但是我只是简洁地说" to"。它简短明了,暗示将变量传递给表达式。我想它可能会与数字2("两个")混淆,但是在讲话时我倾向于将" to"发音为更像" ta"。没人(至少知道lambdas)从未告诉我他们认为它含糊不清...

1
2
3
4
5
//"Func f equals x to x times two"
Func f = x=> x * 2;

//"Func test equals c to c dot City equals London"
Func test = c => c.City =="London"


除了获取前面的作用域(在发生lambda表达式时在正常代码行范围内的所有变量和常量都可用于该表达式的代码)之外,lambda表达式本质上是内联函数的语法糖。

生产运算符左侧的值列表(" =>")构成用于对该函数进行调用的堆栈框架的结构和内容。可以说,值列表对参数声明和所传递的参数都起作用。在更常规的代码中,它们确定用于调用函数的堆栈帧的结构和内容。

结果,值"转到"表达式代码。您是说"定义堆栈框架"还是"转到"? :)

在狭义定义的布尔表达式用作过滤条件的应用中(此问题的其他答案广泛考虑了lambda表达式的主要用法),为了支持代码的意图而跳过该方法是非常合理的,这导致"为此",简洁明了,并详细说明了代码的含义。

但是,lambda表达式并不是唯一的Linq省份,因此在此上下文之外,应使用更通用的形式" goes to"。

但是为什么要"去"?

因为"填充以下代码的堆栈框架"太长了,以至于无法继续说出来。我想您可以说"是/已传递给"。

显式传递的参数和捕获的变量之间的一个关键区别(如果我没记错的话,如果我错了,请纠正我)是前者通过引用传递,后者通过值传递。


在Ruby中,相同的sybmol称为" hashrocket",而且我听说C#程序员也使用该术语(即使这样做是错误的)。


问题的一部分是,您可以根据其结构不同大声地读出它。可惜的是,它不像红宝石的|一样漂亮或没有那么综合。


我的两分钱:

1
s => s.Age > 12 && s.Age < 20

"带有参数s的Lambda表达式为{return s.Age > 12 && s.Age < 20;}"

我喜欢这个,因为它让我想起了lamdba表达的来源

1
delegate(Student s) { return s.Age > 12 && s.Age < 20; };

=>只是一个快捷方式,因此您不必使用委托关键字并包含类型信息,因为编译器可以推断出它。