我正在阅读 Eric 关于静态构造函数的博客系列,并想到由于实例构造函数可以重载,为什么静态构造函数不能重载?这背后的原因是什么?
3 回答
因为你永远不能直接调用静态构造函数;它总是由运行时为您隐式完成。因此,您不能将参数传递给静态构造函数;因此,唯一可能的静态构造函数是具有默认参数的构造函数。
静态构造函数不能带参数。这意味着您不能创建不同的方法签名来防止过载。
询问“为什么”以这种方式设计特定语言功能通常会导致意见问题,这就是为什么 Stack Overflow 不鼓励这类问题。也就是说,有时一个答案,即使只是一个意见问题,也可以导致更深入的理解。请理解,我不在C# 开发团队中,也不以任何方式隶属于 Microsoft,因此您可以对我的回答持保留态度。
静态构造函数的工作是初始化类运行所需的任何静态数据。C# 的设计使得静态构造函数保证在创建类的任何实例之前以及在调用任何静态方法或访问静态属性之前执行。
编写简单的程序很容易,看起来您可以手动做出保证——通过让应用程序调用静态构造函数作为它首先要做的事情之一。但是它不需要非常复杂的程序来确保在第一次使用类的实例之前调用所有静态构造函数变得困难。
例如,假设您包含一个名为的第三方组件Foo
,该组件具有静态构造函数。为了使用它,您的应用程序必须Foo
在执行任何其他操作之前调用静态构造函数。并且Foo
必须编写构造函数,以便它为它使用的每个类调用静态构造函数。如果Foo
静态构造函数和Bar
静态构造函数都必须确保Frob
调用静态构造函数会发生什么?在您的场景中,调用它的第二个肯定会引发异常。
您可能会将该责任转移到主程序,以便它在调用静态构造函数 for和Frob
之前调用静态构造函数,但是每个类的静态构造函数都必须是,并且您的代码将充满对事物的静态构造函数的调用除了你关心的某个班级需要它之外,你一无所知。Foo
Bar
public
这听起来对我来说不是一个非常友好的设计。
如果您的静态构造函数需要一个参数,将该参数放在应用程序配置文件中或从命令行获取它。我强烈建议不要创建Initialize
手动调用的单独方法,主要是因为很难确保在需要时调用这样的东西。有关更多信息,请参阅小心使用静态类,包括一些信息链接。
因此,在我看来,静态构造函数以它们的方式工作的原因是,考虑到语言的整体设计,这是唯一有意义的方式。
如果你正在寻找的是一个单身......好吧,那是另一回事。我建议 Jon Skeet在 C# 中实现单例模式。