【问题标题】:Why is the static modifier necessary in this code? [duplicate]为什么这段代码中需要静态修饰符? [复制]
【发布时间】:2016-04-18 19:55:55
【问题描述】:

我读过static。我知道这是一个只能由非对象访问的前缀。但我不明白为什么Easter 必须是static

class JsonFile
{
    public List<Holiday> StandardHolidays = new List<Holiday>();
    public List<ChangingHoliday> ChangingHoliday = new List<ChangingHoliday>();

    public static Easter Easter = new Easter();
    public static DaysToOffset GoodFriday = new DaysToOffset("Good Friday", Easter, -2);
}

我还不明白static 的概念。谁能解释一下?

【问题讨论】:

  • static在哪里?
  • 要实现这一点,请将初始化移动到显式的非静态构造函数中,如下所示:class JsonFile { public List&lt;Holiday&gt; StandardHolidays; public List&lt;ChangingHoliday&gt; ChangingHolidays; public Easter Easter; public DaysToOffset GoodFriday; public JsonFile() { StandardHolidays = new List&lt;Holiday&gt;(); ChangingHolidays = new List&lt;ChangingHoliday&gt;(); Easter = new Easter(); GoodFriday = new DaysToOffset("Good Friday", Easter, -2); } 如果定义了多个构造函数重载,请不要忘记从任何地方“链接”: this() 构造函数.

标签: c# object static


【解决方案1】:

在初始化期间,您不能拥有 Easter 的实例,但在使用时需要一个

public DaysToOffset GoodFriday = new DaysToOffset("Good Friday", Easter, -2);

所以Easter 必须是static,这样它在GoodFriday 中的存在才有效。

【讨论】:

  • 你能解释一下为什么我不能有一个复活节的实例吗?
  • 他可以通过将字段的初始化(甚至只是其中的第四个)移动到非静态构造函数中来解决这个问题。
  • @Code_Steel 因为编译器可以重新排列这些 - 不能保证 Easter 会在 GoodFriday 之前初始化,所以如果不使用 static,你可能会得到 NullReferenceException。阅读重复的问题,Oded 给出了很好的解释。
  • @Idos OP 在答案中解释了原因。
  • 所提到的解释(在您的评论中)是不正确的。我在链接的线程中添加了一条评论,在 Oded 的回答下。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多