一个只读静态字段如何为空?

ger*_*rod 27 c# asp.net-mvc static readonly nullreferenceexception

所以这是我的一个课程的摘录:

    [ThreadStatic]
    readonly static private AccountManager _instance = new AccountManager();

    private AccountManager()
    {
    }

    static public AccountManager Instance
    {
        get { return _instance; }
    }
Run Code Online (Sandbox Code Playgroud)

如您所见,它是一个单线程每线程 - 即实例标有ThreadStatic属性.该实例也被实例化为静态构造的一部分.

既然如此,当我尝试使用Instance属性时,我的ASP.NET MVC应用程序中是否有可能出现NullReferenceException?

Aus*_*nen 38

引用MSDN ThreadStaticAttribute:

不要为标记有ThreadStaticAttribute的字段指定初始值,因为这样的初始化只在类构造函数执行时发生一次,因此只影响一个线程.如果未指定初始值,则可以依赖于初始化为默认值的字段(如果它是值类型),或者如果它是引用类型,则依赖于空引用(在Visual Basic中为Nothing).


Jar*_*Par 12

这是ThreadStatic属性的一个令人困惑的部分.即使它为每个线程创建一个值,初始化代码也只在其中一个线程上运行.访问此值的所有其他线程将获得该类型的默认值,而不是初始化代码的结果.

而不是值初始化,将其包装在为您执行初始化的属性中.

[ThreadStatic]
readonly static private AccountManager _instance;

private AccountManager()
{
}

static public AccountManager Instance
{
  get 
  { 
    if ( _instance == null ) _instance = new AccountManager();
    return _instance; 
  }
}
Run Code Online (Sandbox Code Playgroud)

因为_instance每个线程的值是唯一的,所以在属性中不需要锁定,并且可以将其视为任何其他延迟初始化值.


Rob*_*ine 8

你在这里打出了经典的[ThreadStatic]"101".

静态初始化程序只会触发一次,即使它被标记为[ThreadStatic],所以其他线程(除了第一个)将看到这个未初始化.