Mar*_*som 9 c# struct default-value initializer-list
如果使用初始化列表创建a struct,那么您忽略的成员是否会获得已知的默认值?
public struct Testing
{
public int i;
public double d;
public string s;
}
Testing test = new Testing { s="hello" };
Run Code Online (Sandbox Code Playgroud)
我发现微软的链接暗示了它,但没有明确说明:默认值表(C#参考).
一个小的测试程序显示它不会生成编译器错误并产生预期的结果.我知道最好不要依靠简单的测试来保证.http://ideone.com/nqFBIZ
pid*_*pid 11
是的,它们包含默认值(T),其中T是值的类型.对象引用将为null.
摘抄:
如第5.2节所述,几种变量在创建时会自动初始化为默认值.对于类类型和其他引用类型的变量,此缺省值为null.但是,由于结构体是不能为null的值类型,因此结构的默认值是通过将所有值类型字段设置为其默认值并将所有引用类型字段设置为null而生成的值.
取自这里:
http://msdn.microsoft.com/en-us/library/aa664475(v=vs.71).aspx
我记得在研究MOC时,他们明确说明了这一点.这是该语言的保证功能.
扩展pid的答案:
test = new Testing { s = hello }
Run Code Online (Sandbox Code Playgroud)
被指定为具有以下语义:
Testing temp = new Testing();
temp.s = "hello";
test = temp;
Run Code Online (Sandbox Code Playgroud)
值类型的默认构造函数记录为构造函数,该构造函数将实例的所有字段设置为其默认值.
更一般地说,C#语言要求值类型的任何构造函数都具有在构造函数正常终止之前明确赋值所有字段的属性.
现在,如果没有调用构造函数,那么有两种情况.如果最初分配了变量,那么变量的行为与调用默认构造函数的行为相同.例如,如果你说
Testing[] test = new Testing[1];
Run Code Online (Sandbox Code Playgroud)
然后test[0]将其初始化为默认值,就像您说的那样
Testing[] test = new Testing[1] { new Testing() };
Run Code Online (Sandbox Code Playgroud)
如果变量不是最初分配,例如,一个局部变量,那么你需要你读这之前肯定分配的所有字段.也就是说,如果我们有一个本地人:
Testing test;
test.s = "hello";
Console.WriteLine(test.d); // ERROR, test.d has not been written yet.
Run Code Online (Sandbox Code Playgroud)
还要注意,可变结构是C#中最糟糕的做法.相反,创建一个公共构造函数来设置所有字段,使字段为私有,并将属性getter放在它们之上.