我正在阅读Eric关于静态构造函数的博客系列,想到了实例构造函数可以重载,为什么静态构造函数不能重载? 这不提供相同的原因是什么?
答案 0 :(得分:16)
因为你永远不会直接调用静态构造函数;它总是由运行时隐式完成。因此,您无法将参数传递给静态构造函数;因此,唯一可能的静态构造函数是具有默认参数的构造函数。
答案 1 :(得分:5)
静态构造函数不能接受参数。这意味着您无法创建防止过载的其他方法签名。
答案 2 :(得分:2)
询问“为什么”特定语言功能的设计往往导致意见问题,这就是为什么在Stack Overflow上不鼓励这些问题的原因。也就是说,有时一个答案,即使只是一个意见问题,也可以导致更深刻的理解。理解,我在C#开发团队中不或以任何方式与Microsoft有关联,所以你可以毫不犹豫地回答我的问题。
静态构造函数的工作是初始化类所需的任何静态数据。 C#的设计是这样的,静态构造函数保证在创建类的任何实例之前,以及在调用任何静态方法或访问静态属性之前执行。
通过使应用程序调用静态构造函数作为其首要任务之一,您可以轻松编写简单程序,以便您可以手动进行保证。但它并不需要一个非常复杂的程序来确保在首次使用类的实例之前确保调用所有静态构造函数。
例如,假设您包含一个名为Foo
的第三方组件,它具有静态构造函数。为了使用它,您的应用程序必须在执行任何其他操作之前调用Foo
静态构造函数。并且必须编写Foo
构造函数,以便为它使用的每个类调用静态构造函数。如果Foo
静态构造函数和Bar
静态构造函数都必须确保调用Frob
静态构造函数,会发生什么?在你的场景中,第二个调用它的肯定会抛出异常。
您可能会将该职责移至主程序,以便在调用Frob
和Foo
的静态构造函数之前调用Bar
的静态构造函数,但随后会调用每个类的静态构造函数必须是public
,你的代码将充满对静态构造函数的调用,除非你关心的某些类需要它,否则你完全不了解它们。
这对我来说听起来不是一个非常友好的设计。
如果静态构造函数需要参数,请将该参数放在应用程序配置文件中或从命令行获取。我强烈建议不要手动调用单独的Initialize
方法,主要是因为很难确保在需要时调用这样的东西。有关更多信息,请参阅Be careful with static classes,包括一些信息性链接。
因此,在我看来,静态构造函数的工作原理是因为这是唯一有意义的方法,考虑到语言的整体设计。
如果您正在寻找的是单身......那么,这是另一回事。我建议Jon Skeet的Implementing the Singleton Pattern in C#。