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