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
不要为标记有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每个线程的值是唯一的,所以在属性中不需要锁定,并且可以将其视为任何其他延迟初始化值.
你在这里打出了经典的[ThreadStatic]"101".
静态初始化程序只会触发一次,即使它被标记为[ThreadStatic],所以其他线程(除了第一个)将看到这个未初始化.
| 归档时间: |
|
| 查看次数: |
3013 次 |
| 最近记录: |