【问题标题】:Static private data member not initialized in static class?静态私有数据成员未在静态类中初始化?
【发布时间】:2014-03-31 12:46:15
【问题描述】:

鉴于下面的 C# 代码,我希望私有数据成员 _userDataStorage 会立即初始化。相反,我发现它根本没有被初始化。我在初始化语句上放了一个断点,它永远不会被击中。这意味着 DB 静态属性始终返回 NULL。静态类与非静态类的工作方式不同吗?

public static class UserDataStorageWrapper
{
    private static UserDataStorage _userDataStorage = new UserDataStorage();

    public static UserDataStorage DB
    { 
        get
        {
            return _userDataStorage;
        }
    }
}

我现在将更改代码以检查 NULL 并自己初始化 _userDataStorage。但我想在这里确定我的期望。

【问题讨论】:

  • 您的属性实际上是在返回null,还是您的断点根本没有被命中?
  • 使用静态构造函数初始化值有什么不同吗?
  • 你真的使用这个类吗?除非正在使用,否则它可能不会被初始化。
  • 它肯定返回null并且断点没有被命中,这就是它返回null的原因,因为初始化程序没有被执行。查看 MAV 的答案,除非访问对象,否则不会触发静态初始化程序。因为它是私人的,所以永远不会发生。恕我直言,有点奇怪的政策。

标签: c# static initialization static-classes


【解决方案1】:

由于它是一个静态初始化器,它将在“在第一次使用该类的静态字段之前的依赖于实现的时间”进行初始化。 Source

因此您的断点可能不会被命中除非您使用该字段(或该类中的另一个静态字段)。


为了完整起见,我可以补充一点,如果有静态构造函数,静态字段初始化程序将在静态构造函数之前执行。

【讨论】:

    【解决方案2】:

    尝试添加一个静态构造函数并在里面初始化变量。

    public static class UserDataStorageWrapper
    {
        public static UserDataStorageWrapper()
        {
            _userDataStorage = new UserDataStorage();
        }
    
        private static UserDataStorage _userDataStorage;
    
        public static UserDataStorage DB
        { 
            get
            {
                return _userDataStorage;
            }
        }
    }
    

    "如果类中存在静态构造函数,则在执行该静态构造函数之前立即执行静态字段初始化器" @ 987654321@

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-22
      • 1970-01-01
      • 2016-11-29
      • 1970-01-01
      • 1970-01-01
      • 2015-02-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多