代码之家  ›  专栏  ›  技术社区  ›  gerrod

只读静态字段如何可以为空?

  •  27
  • gerrod  · 技术社区  · 15 年前

    下面是我一节课上的摘录:

        [ThreadStatic]
        readonly static private AccountManager _instance = new AccountManager();
    
        private AccountManager()
        {
        }
    
        static public AccountManager Instance
        {
            get { return _instance; }
        }
    

    如您所见,它是每个线程的一个单例——即实例用threadstatic属性标记。实例也作为静态构造的一部分进行实例化。

    因此,在这种情况下,当我尝试使用Instance属性时,如何在我的ASP.NET MVC应用程序中获取NullReferenceException?

    5 回复  |  直到 11 年前
        1
  •  38
  •   Austin Salonen gmlacrosse    15 年前

    报价 MSDN ThreadStaticAttribute :

    不要为指定初始值 字段标记为 threadstaticattribute,因为 初始化仅发生一次,当 类构造函数执行,并且 因此只影响一个线程。如果 不指定初始值, 你可以依靠 初始化为其默认值 是值类型,或为空 如果 它是引用类型。

        2
  •  12
  •   JaredPar    15 年前

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

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

    [ThreadStatic]
    readonly static private AccountManager _instance;
    
    private AccountManager()
    {
    }
    
    static public AccountManager Instance
    {
      get 
      { 
        if ( _instance == null ) _instance = new AccountManager();
        return _instance; 
      }
    }
    

    因为价值 _instance 每个线程都是唯一的,属性中不需要锁定,它可以像任何其他延迟初始化的值一样被处理。

        3
  •  8
  •   Rob Levine    15 年前

    你打了一个经典 [ThreadStatic] 这里是“101”。

    静态初始值设定项将只触发一次, 尽管 它被标记为 [线程静态] ,因此其他线程(除了第一个线程)将看到此未初始化。

        4
  •  1
  •   Zerodestiny    15 年前

    我相信发生的情况是静态字段只被初始化一次,所以当另一个线程试图读取该字段时,它将为空(因为它是默认值),因为\实例无法再次初始化。这只是一个想法,但我可以完全远离,但这就是我认为正在发生的事情。

        5
  •  0
  •   rajeev kumar    11 年前

    带有threadStaticAttribute标记的静态字段在线程之间不共享。每个执行线程都有一个单独的字段实例,并独立地设置和获取该字段的值。如果在不同的线程上访问该字段,则它将包含不同的值。