【问题标题】:When do static declarations get run?静态声明何时运行?
【发布时间】:2009-12-22 15:41:16
【问题描述】:

这是我的一段代码:

public class MyClass {
  public object Value { get; set; }

  public MyClass(object value) {
    this.Value = value;
  }
}

public class AnotherClass {
  private static MyClass _MyObj = new MyClass(new object());

  public static void Main(string[] args) {
    var x = _MyObj; // no problem
    var y = x.Value; // no problem
    var z = y.ToString(); // Null ref exception
  }
}

我不明白这是怎么回事。 _MyObj 不为空,这意味着内联赋值确实有效,但_MyObj.Value 为空,这意味着构造函数代码没有被调用!这里有一些黑暗魔法在起作用,我非常感谢您的解释。

谢谢!

编辑 - 抱歉没有复制。我的实际代码(显然)比这更复杂,所以我试图将其简化,显然在此过程中我必须消除代码正常功能的其他障碍。但无论如何,Kobi's answer 确实是我试图从这个问题中解脱出来的——所以要感谢他。 :)

【问题讨论】:

  • 此代码甚至无法编译,因为您没有 Value 属性的设置器。
  • 哪个编译器?在 VS2008/.NET3.5 下只要我为 Value 属性添加一个设置器就可以正常工作。
  • 不管怎样,stackoverflow.com/questions/1405709/… 没什么可补充的

标签: c# static


【解决方案1】:

初始化静态成员的正确方法是使用static constructor:

static AnotherClass(){
  _MyObj = new MyClass(new object());
}

【讨论】:

  • 风格问题,你的代码和private static MyClass _MyObj = new MyClass(new object());一模一样
  • @Henk - 我意识到这一点,但正如 Shaul 所说,它仍然可以在更复杂的情况下提供帮助。
【解决方案2】:

状态:没有复制。

提供的代码示例无法编译,public object Value { get; } 不是有效的自动属性。

private set; 修复它后,它编译并运行无错误。

【讨论】:

    【解决方案3】:

    放置一个setter,它会按预期工作:

    public object Value { get; set; }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-14
      • 1970-01-01
      • 2013-02-26
      • 2014-05-14
      • 1970-01-01
      相关资源
      最近更新 更多