You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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# 运行时的类型初始化规则已经规避了这种竞态风险,具体逻辑如下:

  • 静态字段初始化属于类型静态构造逻辑的一部分,运行时强制保证:首次访问任意类型的静态成员前,一定会完整执行完该类型的所有静态字段初始化、静态构造函数逻辑,才会继续执行后续访问操作。
  • 针对这个案例,两种触发场景的执行顺序都是安全的:
    1. 首次访问的是A.a:先完成A的静态初始化,a被赋值为5后才会返回访问结果,后续访问B.b时读取A.a拿到的就是正确值。
    2. 首次访问的是B.b:先触发B的静态初始化,执行methodB()时遇到A.a访问请求,会暂停B的初始化流程,先执行A的全部静态初始化逻辑,等A.a赋值为5后再回到B的初始化流程继续执行,b拿到的仍然是正确的5。
  • 额外补充:.NET 运行时还保证了类型静态初始化的全局线程安全性,即使多线程同时首次触发同一个类型的初始化,也只会执行一次初始化流程,不会出现并发初始化导致的异常。

内容的提问来源于stack exchange,提问作者Superior

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 14:24:03