【发布时间】:2019-06-12 19:33:00
【问题描述】:
我的类有一个在构造函数中使用的静态字段初始化器:
class Foo {
private static List<string> list = new List<string>()
private static object listLock = new Object();
public Foo(string s) {
lock(listLock)
list.Add(s);
}
}
我的问题是,它偶尔会发生,在静态初始化程序完成之前在构造函数中访问列表,导致访问list 时出现NullReferenceException。根据this question,只保证静态初始化在实例创建之前启动,而不是完成。
是否有某种方法可以确保仅在静态构造函数完成后才调用构造函数(除了像while(list == null){} 这样的丑陋黑客)?
【问题讨论】:
-
@DanielA.White 那是......不太正确 :) 啊,好 ol' before-field-init
-
如果您只使用显式静态构造函数,这不应该有效吗?
-
静态初始化器和实例构造器都在同一个线程中运行。因此,假设静态初始化器不创建类的实例,静态初始化器将在任何实例构造函数开始之前完成。
-
@TheodorZoulias:这对于初始化程序是不正确的,如我的示例所示。但如果我按照this answer 中的建议创建一个显式静态构造函数,它就会起作用
标签: c# .net constructor .net-core static