为什么不能在结构体内初始化非静态字段?

时间:2010-02-21 06:52:41

标签: c# .net field struct

考虑这个代码块:

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

4 个答案:

答案 0 :(得分:7)

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:-1)

可以做你正在尝试的事情。您所缺少的是一个调用默认构造函数的自定义构造函数:

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

    public Animal(bool someArg) : this() { }
}

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

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

使用任何结构你都可以说new Animal(),但在CLR的工作环境中可以隐式地创建“空白”动物,并且没有办法确保自定义代码每次都运行发生的情况。