2010-02-21 52 views
20

考虑以下代码块:为什么不能在结构体中初始化非静态字段?

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

    // initialize the non-static field here 
    public void FuncToInitializeName() 
    { 
     name = ""; // Now correct 
    } 
} 
  • 为什么我们可以初始化一个结构,但不是non-static领域内static场?
  • 为什么我们必须在方法体中初始化non-static
+1

是否动物的每个实例重20个单位并且没有名字?也许你正在寻找一个构造函数。 (请原谅我的术语,如果这是不正确的。) – GManNickG 2010-02-21 06:56:24

+2

这只是示例代码。 – 2010-02-21 07:02:59

回答

7
+2

虽然在IL级别,他们可以:http://msmvps.com/blogs/jon_skeet/archive/2008/12/10/value-types-and-parameterless-constructors.aspx – 2010-02-21 07:31:51

+0

链接现在被打破 – Dominic 2013-09-13 16:26:43

0

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

静态字段初始值设定项将移至静态构造函数。你可以在一个struct中写一个自定义静态构造函数。

-1

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

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

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

构造有至少需要一个参数,然后它转发给this()得到初始化成员。

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

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

+0

This struct won 't compile'在结构中不能有实例字段初始值设定项“ – 2017-07-12 00:58:01

1

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