在类中使用静态字段
本文关键字:静态 字段 | 更新日期: 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;
}
}