1
199
在创建类的任何实例或访问任何静态成员之前,每个应用程序域只能运行一次静态构造函数。 https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/static-constructors
|
2
91
虽然所有这些答案都给出了相同的一般答案,但有一个警告。 请记住,泛型类的所有潜在派生都编译为单个类型。因此,在为泛型类型实现静态构造函数时要小心。
编辑:
在控制台中:
|
3
30
是 线程安全。静态构造函数保证只执行一次。 From the C# language specification
Zooba提出了一个很好的观点(比我早了15秒!),静态构造函数不能保证线程安全地共享对单例的访问。这需要以另一种方式处理。 |
4
9
以下是c#singleton上上述MSDN页面的Cliffnotes版本:
除了明显的单例特性之外,它还免费提供以下两个功能(关于c++中的单例):
|
5
6
静态构造函数保证每个应用程序域只触发一次,所以您的方法应该是正确的。但是,它在功能上与更简洁的内联版本没有什么不同:
当您懒洋洋地初始化事物时,线程安全更是一个问题。 |
6
5
跑步 之前 允许任何线程访问该类。
即使静态构造函数需要很长时间才能运行,其他线程也会停止并等待。所有线程都读取静态构造函数底部设置的x值。 |
7
3
这个 Common Language Infrastructure specification 请注意,如果Singleton的构造函数访问实例属性(甚至是间接访问),那么实例属性将为null。您所能做的最好的事情就是通过在属性访问器中检查实例是否为非null来检测何时发生这种情况并引发异常。静态构造函数完成后,实例属性将为非null。 像 Zoomba's answer 指出您需要使Singleton安全地从多个线程访问,或者在使用Singleton实例时实现锁定机制。 |
8
2
只是为了学究,但是没有静态构造函数,而是静态类型初始值设定项, here's a small 演示循环静态构造函数依赖关系,说明了这一点。 |
9
2
尽管其他答案基本正确,但静态构造函数还有另一个警告。 按章节 二、 10.5.3.3座圈和死锁 ECMA-335 Common Language Infrastructure
以下代码导致死锁
原作者是伊戈尔·奥斯特罗夫斯基,见他的帖子 here . |
10
1
另外,请查看DeveloperZen上关于Singleton的讨论: http://web.archive.org/web/20160404231134/http://www.developerzen.com/2007/07/15/whats-wrong-with-this-code-1-discussion/ |
S qasem · Android内存性能 6 年前 |
R83nLK82 · 在单例设计模式上引发IOException 6 年前 |
hal · 两个课程有什么区别?他们的工作方式不同吗? 6 年前 |
Jaquarh · 如何在不使用DI的情况下实例化父类 6 年前 |
Deepanshu · 基于PHP的Web应用程序中的单例对象状态 6 年前 |
dicle · 视图控制器中的依赖项注入 6 年前 |
Kozuki · 如何在生产代码中考虑单例? 6 年前 |