【问题标题】:Why does C# require parens around conditionals?为什么 C# 需要围绕条件的括号?
【发布时间】:2011-03-29 21:37:14
【问题描述】:

我刚刚阅读了一个关于 Python 的 SO 问题,并注意到 for 循环中缺少括号。对我来说看起来不错,然后我想知道:为什么 C# 需要它们?

比如我目前需要写:

if (thing == stuff) {
}

foreach (var beyonce in allthesingleladies) {
}

所以我想知道为什么我不能写:

if thing == stuff {
}

该语句中是否存在我不知道的句法歧义?

PS,有趣的是,大括号对于单行是可选的:

if (thing == stuff)
  dostuff();

【问题讨论】:

  • 我做 obj-c 和 php,有时你也不必使用。 :p 只是我的 2p。
  • @Ardman - OP 指的是 () 而不是 {} - 但 PS 确实混淆了问题。
  • @Ardman:需要明确的是,只有在if 之后包含多个语句时才需要大括号(单个语句可以跨越多行)。

标签: c# syntax


【解决方案1】:

系统需要某种方式来知道条件何时停止而语句何时开始。这意味着条件周围的括号是可选的, 语句周围的大括号是可选的。 C# 的设计者选择将大括号设为可选(如果只有一条语句)。

考虑一下:

if x == 12 - x == 3 ? x++ : x--;

可以编写一个解析器,它可以判断条件在哪里结束和语句从哪里开始,但是需要括号会使其变得更加容易。在我的例子中,语法表明完整的语句是if (x == 12) { -x == 3 ? x++ : x--; }。但是,您不知道- 是语句的开头,直到您点击第二个==,这已经是3 个标记。

由于正确解析此类示例需要在输入流中提前查看任意数量的标记(并且可以说这会使人类更难阅读代码),因此有充分的理由需要括号。

【讨论】:

  • 你没看错,但根据 BNF,“then”子句中总是有一个语句。诀窍是它可以是一个复合语句,在它的花括号之间包含一些语句。
  • 这是真的。但是,它仍然没有回答为什么不能省略 either 的问题,只要 both 不是。 OP 的最后两个例子都不是模棱两可的——为什么只允许其中一个? (更多地作为一个反问句问......)
  • 啊,好点子。我认为大括号只是一个有趣的琐事——但你是对的,你不能有可选的大括号可选的括号。
  • 如果在下一条语句之前有其他分隔符(如“Then”),则可以有可选的大括号和括号。一些运算符以一元和二元形式存在的事实确实允许一些示例真正模棱两可。类似“如果 x+y==3 && foo() +z==4 && bar();”可以评估为“if (((x+y)==3) && foo()) (+z==4 && bar());”或“如果 (x) ((+y==3) && ((foo()+z)==4) && (bar()));”不同的执行语义。
【解决方案2】:

这是一种可以追溯到 C 语言的语法“功能”,也许是在此之前的某种语言。

本质上是在

之间做出选择
if (condition) statement;

if condition then statement;

在构思 C 的时候,更短的符号和更少的关键字是趋势。

【讨论】:

  • 历史是 CPL -> BCPL -> B -> C -> C++。 CPL 有你的“如果条件那么”语法。 BCPL 有一个“if condition do”语法,仍然没有括号。 B 已经像 C 一样了。
【解决方案3】:

[我知道我可能会因此而激怒她,但我还是要说出来]

作为一个以 vb 为主的程序员,这让我非常恼火。在我看来,括号应该是可选的,大括号是强制性的。如果要求太多,那么微软可以通过引入与 vb 的 Then 等效的 c# 来将 vb 的“借”到 c#。

但那又何必呢?微软基于C、C++和Java设计的C#,都是把if条件放在括号里,为什么c#要不同呢?


编辑

老实说,我认为基于 C# 4 对可选参数和命名参数的采用,这是 VB 中一直存在的一个特性(至少从 VB6 开始),C# 的下一个版本(即 C# 5.0)也可以引入“新”功能,因此您不必输入不必要的括号。

既然有一个三元的if condition ? truePart : falsePart,有if condition then something 或者对于那些看起来像vb 的不熟悉C# 的人,if condition do something 不会是一个坏主意。

【讨论】:

  • 作为一名前 VB 程序员,我也会发现括号(和大括号,就此而言)很烦人。但作为一名改革过的 C# 程序员,我发现,对我来说,大括号和圆括号使阅读代码更容易,因为它们在视觉上充当栅栏柱(括号和大括号在视觉上与单词不同)。今天我觉得阅读 VB 很不舒服,但我想这归结为你习惯了(或目前正在使用的)。
  • 我同意我发现标点符号更容易阅读。使用单词作为标点符号的语言(如 COBOL 或 VB)更难阅读。
  • VB 也有括号,Then 关键字。使用标点符号而不是关键字只是一种风格偏好。
  • @Hans:如果在 VB 中不必要地使用括号被认为是不好的风格,我不会感到惊讶。
  • @Alex:啊,是的。标识符末尾的一组空括号立即被全世界的 C# 开发人员识别为表示调用方法。(与属性、变量或其他一些成员相反)。这是一条足够重要的信息,在阅读代码时,具有视觉指示器可能非常有价值。此外,在 C# 中调用方法只有一种方式(使用括号);这可以说使语言(以及无摩擦地阅读它的能力)更加一致。
【解决方案4】:

这是一种语言设计选择,它来自 Java,而 C++ 又来自 C,而 C 又来自 ???

Python 不需要括号,因为缩进显示了意图。 F# 也是如此。这是个好主意 (IMO)。

【讨论】:

  • Python 需要冒号来表示封闭语句的开始; F# 使用 dothen
【解决方案5】:

顺便说一句,如果我有我的 druthers,我会允许一个运算符在括号之外:一个领先的感叹号。令我恼火的是,与复杂的正例代码测试相比,复杂负例条件的代码测试结果多了一组括号。

【讨论】:

  • 我同意,if!unless 的一种很好的简短表达方式。
【解决方案6】:

简单地说,这是由于 C/C++/C# 处理空白的方式。您需要某种分隔符,因为语句可以跨越多行。您还需要一种“块”或将语句组合成一个块的方法。

  • C/C++/C# 使用 () 的、{} 的
  • VB/VB.NET/VBScript/VBA 使用 功能/结束功能,子/结束子, If/Then/Else/Else 如果/结束 如果,等等 在。 (仅用于阻塞,因为基于 VB 的语言不支持跨多行的语句。)

如果您的具体问题,您正在使用 () 来创建一个表达式。因此,您需要一种方法来告诉编译器您已完成表达式,因为不需要 {}(阻塞分隔符)。

【讨论】:

    猜你喜欢
    • 2011-01-04
    • 2014-08-09
    • 2015-11-01
    • 2014-12-23
    • 2019-10-27
    • 1970-01-01
    • 2022-07-16
    • 2013-04-07
    • 2010-09-27
    相关资源
    最近更新 更多