在类中使用静态字段

时间:2012-01-26 10:40:57

标签: c# .net .net-4.0

所以我在一个类中有一个字段,但由于某种原因它返回的是未初始化的值0001.01.01。

 private static DateTime start = new DateTime(2011, 1, 1);

另一个静态方法在另一个字段中用作初始化器。

 private static readonly DateTime[] dates = SetupDates(20 * 12);


 private static DateTime[] SetupDates(int n){
    var d = start;
    ....
 }

启动中的“new”需要在SetupDates继续之前完成...所以局部变量d将包含2011.1.1。看起来我错了,我应该使用静态构造函数。这种行为是期待的吗?

5 个答案:

答案 0 :(得分:6)

The order matters here

  

类的静态字段变量初始值设定项对应于以它们出现在类声明中的文本顺序执行的赋值序列。

确保首先声明您的start静态字段。 或者更好的是使用静态构造函数,这样你就不依赖于字段的顺序了。

例如,这有效:

    private static DateTime start = new DateTime(2011, 1, 1);
    private static readonly DateTime[] dates = SetupDates(20 * 12);

但这不是

    //Bad SetupDates relies on start which is not initialized
    private static readonly DateTime[] dates = SetupDates(20 * 12); 
    private static DateTime start = new DateTime(2011, 1, 1);

假设您更改SetupDates以返回DateTime[]

答案 1 :(得分:2)

只需将所有Init代码移动到静态构造函数,然后在您希望它执行的Order中执行它。案件结束;)

答案 2 :(得分:1)

在调用SetupDates()之前没有初始化静态字段,代码中还有其他错误,这在实际提供的代码中是看不到的。

例如,我看到声明:

private void SetupDates(int n)

但也

private static readonly DateTime[] dates = SetupDates(20 * 12);

编辑

如果SetupDates()初始化静态字段,就像提供的代码一样(但我重复代码不正确),你应该注意初始化的顺序。 在那个的情况下,可能会出现在SetupDates()初始化之前调用start的情况。

该函数不返回任何内容,甚至无法编译。

答案 3 :(得分:1)

您无法调用实例方法SetupDates来构建静态字段dates。这段代码不应该编译。

答案 4 :(得分:0)

不明白你的问题,请你只发贴造成问题的一段代码吗? 上面的代码不能编译。您可以使用New对象初始化静态字段。

     var test = new Test();
     test.SetupDates();

如果在SetupDates方法中放置断点,则日期将为1/1/2011

  public class Test {
        private static DateTime start = new DateTime(2011, 1, 1);       


        public void SetupDates()
        {
            //breakpoint here
            var d = start;

        }
    }