天了噜!定义static字段还有顺序要求? | 您所在的位置:网站首页 › 私有静态字段 › 天了噜!定义static字段还有顺序要求? |
private static int a2 = Init; private static int a1 = a2; 定义static字段还有顺序要求? 微软官方文档[1] 明明是这样说的: 在首次访问静态成员之前以及在调用构造函数(如果有)之前,会初始化静态成员。 在首次访问静态成员之前以及在调用构造函数(如果有)之前,会初始化静态成员。 不是应该a2被访问之前会初始化吗? 原因 通过C#代码看不出问题,我们看看 IL代码[2] 实现: ldsfld将静态字段的值推送到计算堆栈上 stsfld 用来自计算堆栈的值替换静态字段的值 ldsfld将静态字段的值推送到计算堆栈上 stsfld 用来自计算堆栈的值替换静态字段的值 原来,静态字段的初始化,是在所在类的静态构造函数中,按照定义的顺序依次完成的。 由于a1和a2是在同一个类里定义的,为a1赋值时a2还没有值,所以使用的是int类型默认值。 解决方法 为了避免这个问题,最好不使用同一个类里的静态字段用于初始化,类似这样: private static int a1 = OtherClass.a2; 如果就是要这样用,可以改成这样的写法: private static int b1 = b2; private static int b2 => Init; 通过IL代码可以看到: b2被转换成get属性,因此不用初始化。 结论 细节是魔鬼!原来定义static字段还真有顺序要求! 如果你觉得这篇文章对你有所启发,请关注我的个人公众号”My IO“,记住我! 参考资料 [1] 微软官方文档: https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/classes-and-structs/static-classes-and-static-class-members#static-members [2]返回搜狐,查看更多 |
今日新闻 |
推荐新闻 |
专题文章 |
CopyRight 2018-2019 实验室设备网 版权所有 |