public void Finalise()
ProcessFinalisation(true);
无法编译,但正确的版本:
public void Finalise()
{
ProcessFinalisation(true);
}
编译很好(当然)。
如果允许我 if 不带括号,当以下代码只有一行时:
if(true)
CallMethod();
为什么不允许具有一个后续行的方法相同? 是否有技术原因?
显而易见的答案是语言规范; 对于推理...我想主要是简单 - 不值得为极少数单语句方法检查规范和编译器的开销。特别是,我可能会看到通用约束等问题(即 where T : IBlah, new()
在签名的末尾)。
请注意,不使用大括号有时会导致歧义,并且在某些地方是不受欢迎的。我个人比这更务实一些,但每个人都有自己的。
可能还感兴趣的是,Razor 中的 C# 不允许在没有显式大括号的情况下使用。完全(即即使是if
等)。
是对的。稍微扩展一下他的答案:在许多地方,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#也不允许。