我刚刚在Python上阅读了一个SO问题,并注意到for循环中缺少括号。看起来对我很好,然后我想知道:为什么C#需要它们?
例如,我目前需要写:
if (thing == stuff) {
}
和
foreach (var beyonce in allthesingleladies) {
}
所以我想知道为什么我不能写:
if thing == stuff {
}
该声明中是否存在我不知道的语法歧义?
PS,有趣的是,大括号对于单行来说是可选的:
if (thing == stuff)
dostuff();
答案 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)
答案 5 :(得分:0)
简单地说,这是由于C / C ++ / C#如何处理空白区域。您需要某种分隔符,因为语句可以跨越多行。您还需要一种方法来“阻止”或将语句组合成一个块。
如果您的具体问题,您正在使用()来创建表达式。因此,您需要一种方法来告诉编译器您已完成表达式,因为不需要{}(阻塞分隔符)。