未初始化的结构成员是否保证具有值?

时间:2014-01-23 23:44:13

标签: c# struct default-value initializer-list

如果您使用初始值设定项列表来创建struct,那么您遗漏的成员会获得已知的默认值吗?

public struct Testing
{
    public int i;
    public double d;
    public string s;
}

Testing test = new Testing { s="hello" };

我在微软发现了一个暗示它的链接,但未明确说明:Default Values Table (C# Reference)

小型测试程序显示它不会生成编译器错误并产生预期结果。我知道最好不要依靠简单的测试来保证。 http://ideone.com/nqFBIZ

2 个答案:

答案 0 :(得分:10)

是的,它们包含默认值(T),其中T是值的类型。 对象引用将为null。

摘录:

  

如第5.2节所述,有几种变量   它们自动初始化为默认值   创建。对于类类型和其他引用类型的变量,这个   默认值为null。但是,因为结构是值类型   不能为null,结构的默认值是由生成的值   将所有值类型字段设置为其默认值和所有引用   键入字段为null。

从这里采取:

http://msdn.microsoft.com/en-us/library/aa664475(v=vs.71).aspx

我记得在研究MOC认证时他们明确说明了这一点。这是该语言的保证功能。

答案 1 :(得分:6)

扩展pid的答案:

test = new Testing { s = hello }

被指定为具有以下语义:

Testing temp = new Testing();
temp.s = "hello";
test = temp;

值类型的默认构造函数被记录为构造函数,它将实例的所有字段设置为默认值。

更一般地说,C#语言要求值类型的任何构造函数具有在构造函数正常终止之前所有字段都明确赋值的属性。

现在,如果没有调用构造函数,那么有两种情况。如果变量最初分配,则变量的行为与调用默认构造函数的行为相同。例如,如果你说

Testing[] test = new Testing[1];

然后将test[0]初始化为默认值,就像您说的那样

Testing[] test = new Testing[1] { new Testing() };

如果变量未初始分配(例如,本地变量),那么需要在读取之前明确分配所有字段。也就是说,如果我们有一个本地:

Testing test;
test.s = "hello";
Console.WriteLine(test.d); // ERROR, test.d has not been written yet.

另请注意,可变结构是C#中最糟糕的做法。相反,创建一个公共构造函数来设置所有字段,使字段成为私有,并将属性getter放在它们之上。