-
internal struct Point{
-
public Int32 m_x, m_y;
-
}
-
internal sealed classs Rectangle {
-
public Point m_topLeft, m_bottomRight;
-
}
在构造Rectangle时候,需要使用new 显式调用C#编译器自动生成的默认构造器。在为Rectangle分配内内存时,由于性能问题,不会为主动调用包含在内的每个值类型字段的构造器。值类型的字段会被初始化为0或null。
-
internal struct Point
-
{
-
public Int32 m_x, m_y;
-
-
public Point(int32 x, Int32 y)
-
{
-
m_x = x;
-
m_y = y;
-
}
-
}
-
-
internal sealed class Rectangle
-
{
-
public Point m_topLeft, m_bottomRight;
-
public Rectangle()
-
{
-
m_topLeft = new Point(1, 2);
-
m_bottomRight = new Point(100, 200);
-
}
-
}
值类型的构造器 只有显示调用才会执行;
-
internal struct Point
-
{
-
public Int32 m_x, m_y;
-
-
public Point()
-
{
-
m_x = m_y = 5;
-
}
-
}
-
-
internal sealed class Rectangle
-
{
-
public Point m_topLeft, m_bottomRight;
-
public Rectangle() {
-
}
-
}
上述还是不会调用,Point的无参构造器,编译器不会自动生成代码调用。这里会报错 error CS0568:结构不能包含显示的无参数构造器;
由于没有无参数构造器,下例也是无法执行
-
internal struct SomeValType
-
{
-
//不能在值类型值内敛实例字段的初始化
-
private Int32 m_x = 5;
-
}
在访问值类型的任何字段之前,都需要对全部字段进行赋值。所以,值类型的任何构造器都必须初始化值类型的全部字段。
-
internal struct SomeValType
-
{
-
private Int32 m_x, m_y;
-
//不能在值类型值内敛实例字段的初始化
-
public SomeValType(Int32 x)
-
{
-
m_x = x;
-
//m_y没有进行初始化
-
}
-
}
上例由于没有给m_y赋值所以会报错。
-
public SomeValType(Int32 x)
-
{
-
//会将所有字段初始化化为0/null
-
this = new SomeValType();
-
-
m_x = x;
-
//用x 覆盖 m_x的0
-
//m_y已经初始化为0
-
}
在值类型的构造其中,this代表值类型的本身的一个实例,用new创建的值类型的一个实例可以赋给this。在new的过程中,会将所有字段重置为零。而在引用类型的构造器中,this为只读的,所以不能对它进行赋值。