为什么C#静态构造函数需要括号?

时间:2011-05-23 03:56:04

标签: c# syntactic-sugar static-constructor

考虑:

class Foo
{
    static Foo()
    {
        // Static initialisation
    }
}

为什么()需要static Foo() {...}?静态构造函数必须始终是无参数的,为什么要这么麻烦?它们是否有必要避免一些解析器歧义,或者只是为了保持与常规无参数构造函数的一致性?

由于它看起来非常像初始化块,我经常发现自己意外地将它们排除在外,然后不得不考虑几秒钟的错误。如果他们可以以同样的方式被淘汰将会很好。

3 个答案:

答案 0 :(得分:11)

因为它是一个静态的构造函数,所以它是static +一个看起来很正常的构造函数。

一致性是关键。 : - )

答案 1 :(得分:6)

我经常遇到这样的问题;也就是说,“编译器可以解决这个问题,但为什么需要它?”以下是此类问题的另一个例子:

C# using consts in static classes

正如我在那个问题中所指出的,基本上我们在这种情况下有三种选择。使所需的冗余文本,使其成为可选,或使其成为非法。

每个都有自己的缺点。

使其成为必需的缺点是你最终会在语言中出现不必要的冗余。

让它成为可选项的缺点是让那些认为两种形式之间必须存在差异的人感到困惑。此外,您使错误恢复解析器更难以完成其工作;它在冗余方面蓬勃发展。而且您可能会在将来添加新的语言功能时更加困难,因为已经声称更多的“语法区域”。

使其成为非法的缺点是你做了一个“陷阱”,用户必须记住哦,是的,我应该把parens放在这里,但不是在这里。

建议的功能最好有一个上行支付下行。在我看来,最小的缺点是第一个:让它成为必需品。其他选择我希望有一个上升空间来证明下行,我在这里没有看到。

答案 2 :(得分:1)

我认为这是为了消除歧义:它使解析器的工作更容易,将代码块识别为构造函数子例程(无论static ness);相反,它有助于确保人类作者/维护者通过强制他们使用特定的方法类语法来了解选择此特定构造的含义。