C#静态字段初始化顺序问题:A.a与B.b哪个会先完成初始化?
C# 跨类型静态字段初始化顺序问题解答
问题示例代码
class A { static int a = methodA(); static int methodA() { return 5; } } class B { static int b = methodB(); static int methodB() { return A.a; } // 问题点:`b`依赖于`a` }
结论
你担心的读取未初始化垃圾值的情况完全不会发生,C# 运行时的类型初始化规则已经规避了这种竞态风险,具体逻辑如下:
- 静态字段初始化属于类型静态构造逻辑的一部分,运行时强制保证:首次访问任意类型的静态成员前,一定会完整执行完该类型的所有静态字段初始化、静态构造函数逻辑,才会继续执行后续访问操作。
- 针对这个案例,两种触发场景的执行顺序都是安全的:
- 首次访问的是
A.a:先完成A的静态初始化,a被赋值为5后才会返回访问结果,后续访问B.b时读取A.a拿到的就是正确值。 - 首次访问的是
B.b:先触发B的静态初始化,执行methodB()时遇到A.a访问请求,会暂停B的初始化流程,先执行A的全部静态初始化逻辑,等A.a赋值为5后再回到B的初始化流程继续执行,b拿到的仍然是正确的5。
- 首次访问的是
- 额外补充:.NET 运行时还保证了类型静态初始化的全局线程安全性,即使多线程同时首次触发同一个类型的初始化,也只会执行一次初始化流程,不会出现并发初始化导致的异常。
内容的提问来源于stack exchange,提问作者Superior
相关产品推荐
相关产品推荐

