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

本文关键字:方法 有一个 语句 为什么 | 更新日期: 2023-09-27 17:56:38

public void Finalise()
    ProcessFinalisation(true);

无法编译,但正确的版本:

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

编译很好(当然)。

如果允许我 if 不带括号,当以下代码只有一行时:

if(true)
    CallMethod();

为什么不允许具有一个后续行的方法相同? 是否有技术原因?

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

显而易见的答案是语言规范; 对于推理...我想主要是简单 - 不值得为极少数单语句方法检查规范和编译器的开销。特别是,我可能会看到通用约束等问题(即 where T : IBlah, new()在签名的末尾)。

请注意,不使用大括号有时会导致歧义,并且在某些地方是不受欢迎的。我个人比这更务实一些,但每个人都有自己的。

可能还感兴趣的是,Razor 中的 C# 不允许在没有显式大括号的情况下使用。完全(即即使是if等)。

Marc基本上

是对的。稍微扩展一下他的答案:在许多地方,C# 需要支撑语句块,而不是允许"裸"语句。它们是:

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

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

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

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

然后像往常一样调用它:

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

简短回答:C# 的样式以 C 为样式,C 要求使用函数,因为 C 函数声明过去是这样。

有历史的长版本:回到K&R C,函数是这样声明的:

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

当然,在这种安排中,你不可能有无支撑的功能。ANSI C 规定了我们都知道和喜爱的语法:

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

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

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

相关文章: