假设我们有以下代码:
struct Point {
public Int32 m_x, m_y;
}
class Rectangle {
Point p;
}
//Program.cs
static void Main(string[] args) {
Point p;
int i = p.m_x // does't compile, unassigned field m_x
}
所以我们需要初始化结构体:
static void Main(string[] args) {
Point p;
p.m_x = 0;
int i = p.m_x; // compile OK now
}
或者我们可以使用所有struct的默认无参数构造函数来初始化它的字段:
static void Main(string[] args) {
Point p = new P();
int i = p.m_x //OK
}
所以看起来我们需要初始化结构,但如果结构是类中的一个字段,那么它不需要初始化:
static void Main(string[] args) {
Rectangle r = new Rectangle();
int i = r.p.m_x; // comile OK
}
仍然可以编译,即使我没有初始化结构。我检查了IL代码,发现Rectangle
的构造函数也没有调用结构的无参数构造函数。
需要初始化局部变量:
结构类型的实例化
关于字段,让我们看一下c# ECMA 334规范在c#中,必须先初始化声明的变量,然后才能使用它。因为结构类型变量不能为空(除非它是变量(可空值类型),则必须实例化一个实例
15.5.5字段初始化
字段的初始值,无论是静态字段还是静态字段实例字段,是默认值
10.3默认值
9.3.3默认构造函数……
变量的默认值取决于变量的类型并确定如下:
- 对于值类型的变量,的默认值与该值类型的默认构造函数计算的值相同。
所有值类型都隐式声明一个称为默认构造函数的公共无参数实例构造函数。默认构造函数返回一个零初始化实例,作为的默认值值类型:
对于所有简单类型,默认值是由全0位模式产生的值:
- 对于sbyte、byte、short、ushort、int、uint、long、ulong,默认值为0。
- 对于char,默认值是'x0000'。
- 对于float,默认值是0.0f
- 对于double,默认值为0.0d。
- 对于十进制,默认值为0.0m。
- 对于bool,默认值为false。
对于枚举类型E,默认值为0,转换为E类型。9类型
对于结构类型,默认值是将所有值类型字段设置为其默认值和所有引用所产生的值将字段设置为空