静态构造函数未被调用?代码触发NullReferenceException求助
解决静态构造函数未被调用导致的NullReferenceException问题
嘿,我一眼就揪出问题所在啦!你遇到的NullReferenceException根本不是静态构造函数没被调用,而是静态成员的初始化顺序搞反了。
问题根源
在C#里,类型的静态字段/属性初始化器是在静态构造函数执行之前运行的。你的FirstTime是只读自动实现属性,它的初始化表达式!GetContainer("UserInfo").Values.ContainsKey("complete")会在静态构造函数给container赋值之前就执行——这时候container还是null,调用GetContainer自然就触发空引用异常了。
解决方案
有两种简单的修复方式,按需选就行:
方案1:延迟加载FirstTime属性
把FirstTime改成带后台字段的属性,第一次访问时再计算值,确保container已经初始化:
using Windows.Storage; internal static class AppData { private static ApplicationDataContainer container; private static bool? _firstTime; // 用可空类型避免重复计算 public static bool FirstTime { get { if (_firstTime == null) { _firstTime = !GetContainer("UserInfo").Values.ContainsKey("complete"); } return _firstTime.Value; } } static AppData() { container = ApplicationData.Current.LocalSettings; } private static ApplicationDataContainer GetContainer(string name) { return container.CreateContainer(name, ApplicationDataCreateDisposition.Always); } }
方案2:把FirstTime的初始化移到静态构造函数
如果不需要延迟加载,直接把FirstTime的初始化逻辑放进静态构造函数里,保证依赖的container已经被赋值:
using Windows.Storage; internal static class AppData { private static ApplicationDataContainer container; public static bool FirstTime { get; private set; } // 改为私有setter static AppData() { container = ApplicationData.Current.LocalSettings; FirstTime = !GetContainer("UserInfo").Values.ContainsKey("complete"); } private static ApplicationDataContainer GetContainer(string name) { return container.CreateContainer(name, ApplicationDataCreateDisposition.Always); } }
小提醒
记住C#的静态初始化顺序:静态字段初始化器 → 静态构造函数。当静态成员依赖于静态构造函数里初始化的对象时,千万别在初始化器里直接调用依赖这些对象的方法,不然很容易踩空引用的坑。
内容的提问来源于stack exchange,提问作者sndai
相关产品推荐
相关产品推荐

