【问题标题】:Why can't non-static fields be initialized inside structs?为什么不能在结构中初始化非静态字段?
【发布时间】:2011-01-19 07:02:10
【问题描述】:

考虑这个代码块:

struct Animal
{
    public string name = ""; // Error
    public static int weight = 20; // OK

    // initialize the non-static field here
    public void FuncToInitializeName()
    {
        name = ""; // Now correct
    }
}
  • 为什么我们可以在结构中初始化 static 字段而不是 non-static 字段?
  • 为什么我们必须在方法体中初始化non-static

【问题讨论】:

  • 是否每个 Animal 实例的重量都为 20 个单位并且没有名称?也许您正在寻找构造函数。 (如果不正确,请原谅我的术语。)

标签: c# .net field struct


【解决方案1】:

【讨论】:

【解决方案2】:

CLI 期望能够分配和创建任何需要“n”字节内存的值类型的新实例,方法是简单地分配“n”字节并用零填充它们。没有理由 CLI“不能”提供一种方法来指定在任何包含结构的实体可用于外部代码之前,必须在其中的每个结构上运行构造函数,或者每当特定 n- 的实例创建字节结构时,编译器应复制“模板实例”。然而,事实上,CLI 不允许这样的事情。因此,编译器没有理由假装它有办法确保将结构初始化为除内存填充零默认值之外的任何内容。

【讨论】:

    【解决方案3】:

    您不能在结构中编写自定义默认构造函数。实例字段初始值设定项最终需要移动到您无法定义的构造函数中。

    静态字段初始值设定项被移至静态构造函数。您可以在结构中编写自定义静态构造函数。

    【讨论】:

      【解决方案4】:

      可以做你想做的事。你所缺少的只是一个调用默认构造函数的自定义构造函数:

      struct Animal
      {
          public string name = ""; 
          public static int weight = 20; 
      
          public Animal(bool someArg) : this() { }
      }
      

      构造函数必须至少接受一个参数,然后它必须转发到this()以初始化成员。

      这样做的原因是编译器现在有一种方法可以发现代码应该运行以初始化name 字段的时间:每当您编写new Animal(someBool) 时。

      对于任何结构,您都可以说 new Animal(),但是在 CLR 的工作过程中,在许多情况下都可以隐式创建“空白”动物,并且没有办法确保每次发生时都运行自定义代码。

      【讨论】:

      • 这个结构不会编译“结构中不能有实例字段初始化器”
      猜你喜欢
      • 1970-01-01
      • 2012-01-07
      • 2018-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-02
      相关资源
      最近更新 更多