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

为什么C#需要围绕条件句的paren?,c#,syntax,C#,Syntax,我刚刚读到一个关于Python的问题,注意到for循环中缺少括号。我觉得很好,然后我想:为什么C#需要它们 例如,我目前需要写: if (thing == stuff) { } 及 所以我想知道为什么我不能写: if thing == stuff { } 那句话中是否有我不知道的句法歧义 有趣的是,对于一个衬里,支架可以是可选的: if (thing == stuff) dostuff(); 这是一个来自java的语言设计选择,它又来自C++,而C又来自C,而C又来自于.< /p> P

我刚刚读到一个关于Python的问题,注意到for循环中缺少括号。我觉得很好,然后我想:为什么C#需要它们

例如,我目前需要写:

if (thing == stuff) {
}

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

if thing == stuff {
}
那句话中是否有我不知道的句法歧义

有趣的是,对于一个衬里,支架可以是可选的:

if (thing == stuff)
  dostuff();

这是一个来自java的语言设计选择,它又来自C++,而C又来自C,而C又来自于.< /p>
Python不需要大括号,因为缩进显示了它的意图。F#也这样做。这是个好主意(IMO)。

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

考虑这一点:

if x == 12 - x == 3 ? x++ : x--;
可以编写一个解析器,它可以告诉条件在哪里结束,语句在哪里开始,但是需要括号使它变得更加容易。在我的示例中,语法指示完整语句是
if(x==12){-x==3?x++:x--;}
。但是,在点击第二个
==
之前,您不知道
-
是语句的开头,而第二个
==
中已经有3个标记


由于正确解析此类示例需要在输入流中查找任意数量的标记(这可能会使代码更难阅读),因此有理由要求使用parens。

[我知道我可能会为此大发雷霆,但我还是要说]

作为一个以vb为主的程序员,这是一件让我非常恼火的事情。在我看来,括号应该是可选的,大括号应该是强制性的。如果要求太高,那么微软可以从vb中“借用”到c语言中,方法是引入一个与vb相当的c语言

那又何必麻烦呢?微软设计了基于C、C++和java的C语言,所有的都将if条件放在父母中,为什么C应该不同?
编辑

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


因为有一个三元
if条件?truePart:falsePart
,拥有
if condition then something
,或者对于那些看起来像vb的不喜欢C的人来说,
if condition do something
不是一个坏主意。

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

从本质上讲,这是一种选择

if (condition) statement;


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

顺便说一句,如果我有我的druthers,我会允许一个运算符在parens之外:一个前导感叹号。与复杂的正条件下的代码测试相比,复杂的负条件下的代码测试最终会有一组额外的括号,这让我很恼火。

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

  • C/C++/C#use(),{}
  • VB/VB.NET/VBScript/VBA使用 功能/结束功能,子/结束子, If/Then/Else/Else If/End If,依此类推 在…上(仅用于阻塞,因为基于VB的语言不支持跨多行的语句。)

如果您的问题是特定的,则使用()来创建表达式。因此,您需要一种方法来告诉编译器您已经使用了表达式,因为{}(阻塞分隔符)不是必需的。

我使用obj-c和php,您有时也不必使用if:p只是我的2p。@Ardman-OP指的是
()
而不是
{}
-但PS确实会混淆问题。@Ardman:说清楚,只有在
if
后面包含多个语句时才需要大括号(单个语句可以跨多行)。你没有错,但根据BNF,“then”子句中总是有一个语句。诀窍在于它可以是一个复合语句,在它的卷曲之间包含一些语句。这是真的。然而,它仍然不能回答为什么两者都不能被接受的问题,只要两者都不能。OP的最后两个例子都不是模棱两可的——为什么只允许其中一个?(更多的是作为一个反问句提问…)啊,说得好。我认为大括号只是一个有趣的琐事——但你是对的,你不能有可选的大括号和可选的括号。如果在下一个语句之前有其他分隔符(比如“Then”),你可以有可选的大括号和括号。一些运算符以一元和二元形式存在的事实确实允许某些示例真正模棱两可。像“if x+y==3&&foo()+z==4&&bar();”这样的东西可以计算为“if((x+y)==3)和&foo())(+z==4&&bar());”或者“if(x)((+y==3)和((foo()+z)==4)和(bar());”不同的执行语义。作为前VB程序员,我也会发现括号(和大括号)令人恼火。但作为一名经过改革的C#程序员,我发现,对我来说,大括号和括号使阅读代码变得更容易,因为它们在视觉上起到了围栏的作用(括号和大括号在视觉上与单词不同)。今天我觉得读VB很不舒服,但我想这取决于你习惯了什么(或者现在正在使用什么)。我同意我发现标点符号更容易阅读。使用单词作为标点符号的语言(如COBOL或VB)更难阅读。VB也有paren,Then关键字。用标点符号代替关键字只是一种更受欢迎的风格
if (condition) statement;
if condition then statement;