2009-12-22 69 views
0

这里有一块我的代码:静态声明何时运行?

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出现空,表示构造函数代码未被调用!这里有一些黑魔法,我非常感谢解释。

谢谢!

编辑 - 抱歉没有repro。我的实际代码(显然)比这个更复杂,所以我试图把它弄糊涂,显然在这个过程中,我必须去除代码的正确函数的其他障碍。但是,Kobi's answer真的是我试图摆脱这个问题,无论如何 - 所以回信他。 :)

+2

此代码甚至不会编译,因为您没有Value属性的setter。 – 2009-12-22 07:29:28

+0

哪个编译器?只要为Value属性添加setter,就可以在VS2008/.NET3.5下正常工作。 – 2009-12-22 07:32:13

+2

无论哪种方式,都很少添加到http://stackoverflow.com/questions/1405709/what-is-the-static-variable-initialization-order-in-c – Kobi 2009-12-22 07:35:26

回答

2

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

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

这是一个样式问题,您的代码正是就像私人静态MyClass _MyObj = new MyClass(new object());' – 2009-12-22 20:23:57

+0

@亨克 - 我意识到这一点,但它仍然可以帮助更复杂的场景,就像Shaul所说的那样。 – Kobi 2009-12-22 21:10:56

1

把一个setter和预期它会工作:

public object Value { get; set; } 
2

状态:没有摄制。

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

修复它与private set;它编译并运行W/O错误。