为什么C#需要围绕条件的parens?

时间:2010-08-14 17:23:16

标签: c# syntax

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

例如,我目前需要写:

if (thing == stuff) {
}

foreach (var beyonce in allthesingleladies) {
}

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

if thing == stuff {
}

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

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

if (thing == stuff)
  dostuff();

6 个答案:

答案 0 :(得分:8)

系统需要某种方式来了解条件何时停止并且语句开始。这意味着条件周围的任何一个parens都是可选的,语句周围的大括号是可选的。 C#的设计者选择使大括号可选(如果只有一个语句)。

考虑一下:

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

可以编写一个解析器,它可以告诉条件结束的位置和语句的开始,但要求括号使它变得更加容易。在我的示例中,语法表示完整语句为if (x == 12) { -x == 3 ? x++ : x--; }。但是,您不知道-是语句的开头,直到您点击第二个==,它已经是3个令牌。

由于正确解析这些示例需要在输入流中查找前面任意数量的标记(并且可以说使代码更难以阅读),因此需要使用parens。

答案 1 :(得分:4)

这是一种语法'功能',可以追溯到C,也可能在此之前使用某种语言。

基本上它是

之间的选择
if (condition) statement;

if condition then statement;

在构思C时,较短的符号和较少的关键词是趋势。

答案 2 :(得分:2)

[我知道我很可能因此受到了抨击,但我必须说出这一切]

作为一个以vb为主的程序员,这是让我惹恼我的一件事。在我看来,parens应该是可选的,并且括号是强制性的。如果要求太多,那么微软可以通过引入一个等同于vb的c#然后从vb“借用”到c#中。

但是为什么呢?微软设计了基于C,C ++和Java的C#,所有这些都将if条件放在parens中,为什么c#应该不同?


修改

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

由于存在if condition ? truePart : falsePart三元if condition then something,或者对于那些没有进入C#的人看起来像vb,if condition do something不是一个坏主意。

答案 3 :(得分:0)

这是一种来自Java的语言设计选择,后者又来自C ++,C ++又来自C,后者又来自???

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

答案 4 :(得分:0)

顺便说一句,如果我有我的druthers,我会允许一个操作员在parens之外:一个领先的感叹号。让我感到困惑的是,复杂的负面条件的代码测试最终会得到一组额外的括号,与复杂的正面代码测试相比。

答案 5 :(得分:0)

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

  • C / C ++ / C#use()的,{}的
  • VB / VB.NET / VBScript / VBA使用 功能/结束功能,Sub / End Sub, If / Then / Else / Else If / End If等等 上。 (仅限阻止,因为基于VB的语言不支持跨越多行的语句。)

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