3

考虑:

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

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

因为它看起来很像一个初始化程序块,所以我经常发现自己不小心把它们排除在外,然后不得不考虑几秒钟来思考哪里出了问题。如果可以以相同的方式省略它们,那就太好了。

4

3 回答 3

11

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

一致性是关键。:-)

于 2011-05-23T04:00:16.810 回答
6

我经常收到这类问题;也就是说,“编译器可以解决这个问题丢失了,那么为什么需要它?”的问题。这是此类问题的另一个示例:

C# 在静态类中使用 const

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

每个都有自己的缺点。

使其成为必需的缺点是您最终会在语言中产生不必要的冗余。

将其设为可选的缺点是会让那些认为这两种形式之间存在差异的人感到困惑。此外,您使错误恢复解析器更难完成其工作;它依靠冗余而茁壮成长。而且您可能会在未来增加新的语言功能变得更加困难,因为已经声明了更多的“句法区域”。

将其设为非法的不利之处是您随后会做出“陷阱”,用户必须记住,哦,是的,我应该将括号放在这里,但不要放在这里。

提议的功能最好有一个可以弥补缺点的优点。在我看来,最小的缺点是第一个:让它成为必需品。其他选择我希望有一个可以证明不利因素的好处,我在这里没有看到。

于 2011-05-23T15:31:41.890 回答
1

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

于 2011-05-23T04:08:10.770 回答