为什么只有一个语句的方法需要括号?

public void Finalise() ProcessFinalisation(true); 

不编译,但正确的版本:

 public void Finalise() { ProcessFinalisation(true); } 

编译好(当然)。

如果我被允许,如果没有括号,则以下代码只有一行:

 if(true) CallMethod(); 

具有以下一行的方法为什么不允许相同? 有技术原因吗?

从C#6.0开始,您可以声明:

 void WriteToConsole(string word) => Console.WriteLine(word) 

然后像往常一样调用它:

 public static void Main() { var word = "Hello World!"; WriteToConsole(word); } 

显而易见的答案是语言规范; 为了推理…我猜主要是简单 – 它只是不值得理智的检查规则和编译器的开销,只需极少量的单语句方法。 特别是,我可能会看到generics约束等问题(即签名末尾的where T : IBlah, new() )。

请注意,不使用大括号有时会导致含糊不清,在某些地方不赞成。 我比个人更务实,但每个都是他们自己的。

如果没有明确的括号,剃刀内的C# 也不允许使用它也可能是有意义的。 完全(即使是等等)。

马克基本上是对的。 为了扩展他的答案:有很多地方C#需要一个支撑语句块,而不是允许“裸”语句。 他们是:

  • 方法,构造函数,析构函数,属性访问器,事件访问器或索引器访问器的主体。
  • 尝试,捕获,最后,检查,未检查或不安全区域的块。
  • 语句lambda或匿名方法的块
  • 如果块直接包含局部变量声明,则为if或loop语句的块。 (也就是说,“while(x!= 10)int y = 123;”是非法的;你必须支持声明。)

在每种情况下,都可以为单个无支撑语句合法的特征提出明确的语法(或启发式歧义歧义语法)。 但重点是什么呢? 在每种情况下,您都希望看到多个陈述; 单一陈述是罕见的,不太可能的情况。 对于这些非常不可能的情况来说,似乎不值得让语法明确无误。

简短回答:C#在C之后设置样式,并且C要求函数被支撑,因为C函数声明过去是如此。

历史悠久的版本:回到K&R C,函数声明如下:

 int function(arg1, arg2) int arg1; int arg2; { code } 

当然,你不能在这种安排中拥有无支撑的function。 ANSI C强制要求我们都知道和喜爱的语法:

 int function(int arg1, int arg2) { code } 

但是不允许无支撑函数,因为它们会对只知道K&R语法的旧编译器造成严重破坏[并且仍然需要对K&R声明的支持]。

时间流逝,多年后C#围绕C [或C ++设计,在语法方面有相同的差异],并且由于C不允许无支撑function,因此C#也没有。