8
public void Finalise()
    ProcessFinalisation(true);

不编译,但正确的版本:

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

编译良好(当然)。

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

if(true)
    CallMethod();

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

4

4 回答 4

14

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

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

可能还有趣的是,剃刀内部的 C#不允许在没有显式大括号的情况下使用。完全没有(即甚至if等)。

于 2011-05-16T11:29:19.810 回答
11

马克基本上是对的。稍微扩展他的答案:在许多地方,C# 需要一个带括号的语句块,而不是允许一个“裸”语句。他们是:

  • 方法、构造函数、析构函数、属性访问器、事件访问器或索引器访问器的主体。
  • try、catch、finally、checked、unchecked 或 unsafe 区域的块。
  • 语句块 lambda 或匿名方法
  • 如果块直接包含局部变量声明,则为 if 或循环语句的块。(也就是说,“while (x != 10) int y = 123;”是非法的;你必须支持声明。)

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

于 2011-05-16T14:53:25.753 回答
2

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

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

然后像往常一样调用它:

public static void Main()
{
    var word = "Hello World!";
    WriteToConsole(word);
}
于 2016-04-05T12:58:17.167 回答
1

简短的回答: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# 也不允许。

于 2011-11-18T03:28:35.147 回答