我正在阅读埃里克的博客系列的静态构造函数和想到的是,作为实例构造函数可以重载,为什么静态构造函数不能被重载? 背后没有提供相同的原因是什么?静态构造函数重载?
回答
静态构造函数不能带参数。这意味着您不能创建防止过载的不同方法签名。
我知道它不能接受一个参数,但为什么会这样呢,保持这个原因的主要原因是什么,为什么不呢? –
@ user2639248:因为你可以*不*永远直接调用静态构造函数;它是由运行时为你完成的,这就是为什么它可以*不能*取一个参数,请参见[答案](http:// stackover flow.com/a/17978042/45914)。 – jason
问“为什么”一种特定的语言特征被设计成这种方式常常导致意见问题,这就是为什么这些类型的问题在堆栈溢出时不鼓励的原因。也就是说,即使这只是一个意见问题,有时候一个答案可以导致更深入的理解。明白,我是而不是在C#开发团队或任何附属于微软,所以你可以采取我的答案一粒盐。
静态构造函数的工作是初始化类所需的任何静态数据的功能。 C#的设计是这样的,静态构造函数是保证在创建类的任何实例之前,以及在调用任何静态方法或访问静态属性之前执行。
用这种方式编写简单的程序很容易,看起来您可以手动进行保证 - 通过使应用程序调用静态构造函数作为它的第一件事情之一。但是它并不需要一个非常复杂的程序来确保在第一次使用类的实例之前调用所有静态构造函数是很困难的。
例如,假设您包含名为Foo
的第三方组件,该组件具有静态构造函数。为了使用它,您的应用程序必须在执行任何其他操作之前调用Foo
静态构造函数。并且Foo
构造函数将不得不写入,以便它为每个使用的类调用静态构造函数。如果Foo
静态构造函数和Bar
静态构造函数都必须确保调用Frob
静态构造函数,会发生什么情况?在你的场景中,第二个叫它的那个肯定会抛出一个异常。
你可能移动的责任主程序,使其调用静态构造函数Foo
和Bar
之前要求Frob
静态构造函数,但随后每类的静态构造函数必须是public
,你的代码将除了一些你关心的课程需要它之外,你完全不需要知道静态构造函数的调用。
这听起来不像是一个非常友好的设计给我。
如果您的静态构造函数需要一个参数,请将该参数放在应用程序配置文件中或从命令行获取。我强烈建议不要创建手动调用的单独Initialize
方法,主要是因为很难确保在需要时调用此类方法。有关更多信息,请参阅Be careful with static classes,其中包含一些信息链接。
所以在我看来,静态构造函数的工作方式是因为这是在语言的整体设计中唯一有道理的方法。
如果你正在寻找的是一个单身......呃,这是另一回事。我建议Jon Skeet的Implementing the Singleton Pattern in C#。
- 1. Java - 静态构造函数
- 2. Objective C静态构造函数与动态构造函数
- 3. 构造函数和静态函数
- 4. 重载构造映射构造函数
- 5. 公共构造函数和静态构造函数
- 6. C#实例构造函数与静态构造函数
- 7. C#构造函数重载
- 8. 构造函数重载
- 9. C#构造函数重载
- 10. 构造函数重载
- 11. 静态构造函数有用
- 12. 静态构造函数的创建[Mono.Cecil]
- 13. 来自静态构造函数的Database.SetInitializer
- 14. 静态导入和构造函数
- 15. 静态构造函数和继承
- 16. 跟踪静态构造函数执行
- 17. 静态块内的构造函数
- 18. 模仿C++静态构造函数
- 19. C++静态库和构造函数
- 20. 静态类C#构造函数OOP
- 21. 静态构造函数之前反射
- 22. 总是调用静态构造函数
- 23. 静态构造函数,并用它
- 24. Assembly.GetCallingAssembly()和静态构造函数?
- 25. asp.net的MVC - 静态构造函数
- 26. C++线程静态构造函数
- 27. 显式调用静态构造函数
- 28. VB.NET中的静态构造函数
- 29. Database.SetInitializer()在静态构造函数中?
- 30. 静态构造函数和BeforeFieldInit?
Eric的博客maby有任何链接吗? (: – dotixx
谁是埃里克?他的博客链接将帮助我们更好地理解你的问题。 – Renan
参数来自哪里? –