在类中使用静态字段

本文关键字:静态 字段 | 更新日期: 2023-09-27 18:21:33

所以我在一个类中有一个字段,但由于某种原因,它与未初始化的值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;
    ....
 }

认为启动中的"新"需要在SetupDates可以继续之前完成。。。因此局部变量d将包含2011.1.1。看起来我错了,应该使用静态构造函数。这种行为是意料之中的事吗?

在类中使用静态字段

这里的顺序很重要。

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

确保首先声明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[]

只需将所有Init代码移动到静态构造函数中,并按您希望执行的顺序执行它。结案;)

不能调用实例方法SetupDates来构造静态字段dates。此代码不应编译。

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

例如,我看到声明:

private void SetupDates(int n)

还有

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

编辑

如果SetupDates()初始化静态字段,就像在提供的代码中一样(但我重复一遍,代码不正确),您应该注意初始化的顺序。在这种情况下,可能存在在start初始化之前调用SetupDates()的情况。

该函数没有返回任何内容,甚至不可能进行编译。

不理解你的问题,你能只发布引起问题的代码吗?上面的代码没有编译。可以使用New对象初始化静态字段。

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

如果在SetupDates方法中设置断点,则日期将为2011年1月1日

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

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