您在这里只问了一个问题,但是应该回答十二个左右的问题,所以我会全部回答。
这是我假设的顺序
- 类构造函数的开始(也称为
cctor
)
- cctor结束
- 主开始
- MyMethod的开始
它是否正确?
否。正确的顺序是:
- 如果有的话,启动cctor for Program。那没有。
- 程序的cctor结束(如果有)。那没有。
- 主开始
- cctor for MyClass的开始
- cctor for MyClass结束
- MyClass.MyMethod的开始
如果有一个静态字段初始化器怎么办?
在某些情况下,允许CLR更改静态字段初始化程序运行的顺序。有关详细信息,请参见Jon关于该主题的页面:
静态构造函数和类型初始值设定项之间的区别
是否有可能MyMethod
在该类的cctor完成之前调用静态方法?
是。如果cctor本身调用MyMethod,则显然在cctor完成之前将调用MyMethod。
cctor不调用MyMethod。是否有可能MyMethod
在MyClass的cctor完成之前调用静态方法?
是。如果cctor使用另一种类型,其cctor调用MyMethod,则将在MyClass cctor完成之前调用MyMethod。
没有cctor可以直接或间接调用MyMethod!现在是否有可能MyMethod
在MyClass的cctor完成之前调用静态方法?
没有。
即使涉及多个线程,这仍然是正确的吗?
是。在可以在任何线程上调用static方法之前,cctor将在一个线程上完成。
cctor可以多次调用吗?假设两个线程都导致cctor运行。
保证cctor最多调用一次,无论涉及多少线程。如果两个线程“同时”调用MyMethod,则它们竞争。其中一个输掉比赛并阻塞,直到MyClass cctor在获胜线程中完成。
丢失的线程会阻塞,直到cctor完成?真的吗
真。
那么,如果胜利线程上的cctor调用了代码,该代码阻塞了失败线程先前所获取的锁?
然后,您有一个经典的锁定顺序反转条件。您的程序陷入僵局。永远。
那似乎很危险。如何避免僵局?
如果这样做时很痛,那就停止这样做。永远不要做会阻碍cctor的事情。
依靠cctor初始化语义来强制执行复杂的安全性要求是一个好主意吗?拥有负责用户交互的cctor是个好主意吗?
都不是好主意。我的建议是,您应该找到一种不同的方法来确保满足您的方法中影响安全性的前提条件。