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

Tom*_*len 8 c# methods formatting braces

public void Finalise()
    ProcessFinalisation(true);
Run Code Online (Sandbox Code Playgroud)

不编译,但正确的版本:

public void Finalise()
{
    ProcessFinalisation(true);
}
Run Code Online (Sandbox Code Playgroud)

编译好(当然).

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

if(true)
    CallMethod();
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*ell 14

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

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

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

  • @Tom - 我的意思是*维护*歧义 - 经典的例子是在同一个缩进处添加第二个语句,而没有注意到缺少的括号. (3认同)

Eri*_*ert 11

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

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

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


iul*_*net 3

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

void WriteToConsole(string word) => Console.WriteLine(word)
Run Code Online (Sandbox Code Playgroud)

然后像往常一样调用它:

public static void Main()
{
    var word = "Hello World!";
    WriteToConsole(word);
}
Run Code Online (Sandbox Code Playgroud)