二十:构造器之二:实例构造器和结构(值类型)
2009-01-31 20:01
211 查看
值类型不像引用类型那样,必须要有构造器,所以编译器不会为值类型生成无参构造器。如下代码:
internal struct Point
{
public Int32 x, y;
}
internal sealed class RefType
{
public Point left, right;
}
为了构建引用类型RefType的实例,必须使用new操作符,并且必须指定一个操作符,在为RefType分配内存时,内存中包含的值类型的两个字段left和right,出于性能方面的考虑,CLR不打算为包含在引用类型内部的每个值类型字段都调用构造器,但CLR会确保值类型的所有字段都会被初始化为0或者null。
CLR也允许在值类型上定义构造器,但是执行必须显示的调用这些构造器,如下所示:
internal struct Point
{
public Int32 x, y;
public Point(Int32 x, Int32 y)
{
this.x = x;
this.y = y;
}
}
internal sealed class RefType
{
public Point left, right;
public RefType()
{
left = new Point(1,2);
right = new Point(100, 200);
}
}
如果RefType的构造器没有使用new操作符来调用Point的构造器来初始化RefType的left和right字段,那么这两个字段中的x和y字段都将为0。再看下面代码:
internal struct Point
{
public Int32 x, y;
public Point()
{
x = y = 10;
}
}
internal sealed class RefType
{
public Point left, right;
public RefType()
{
}
}
现在构建RefType类的实例时,left和right中的x和y字段的值是0还是10呢?C#编译器不允许值类型定义无参的构造器,所以编译不通过。
再看以下代码:
internal struct Point
{
public Int32 x=10;
}
编译也不能通过,因为我们不能用这种方式来初始化值类型的字段。
internal struct Point
{
public Int32 x, y;
public Point()
{
x = 10;
}
}
编译也不能通过,因为构造器必须初始化值类型的所有字段。
internal struct Point
{
public Int32 x, y;
}
internal sealed class RefType
{
public Point left, right;
}
为了构建引用类型RefType的实例,必须使用new操作符,并且必须指定一个操作符,在为RefType分配内存时,内存中包含的值类型的两个字段left和right,出于性能方面的考虑,CLR不打算为包含在引用类型内部的每个值类型字段都调用构造器,但CLR会确保值类型的所有字段都会被初始化为0或者null。
CLR也允许在值类型上定义构造器,但是执行必须显示的调用这些构造器,如下所示:
internal struct Point
{
public Int32 x, y;
public Point(Int32 x, Int32 y)
{
this.x = x;
this.y = y;
}
}
internal sealed class RefType
{
public Point left, right;
public RefType()
{
left = new Point(1,2);
right = new Point(100, 200);
}
}
如果RefType的构造器没有使用new操作符来调用Point的构造器来初始化RefType的left和right字段,那么这两个字段中的x和y字段都将为0。再看下面代码:
internal struct Point
{
public Int32 x, y;
public Point()
{
x = y = 10;
}
}
internal sealed class RefType
{
public Point left, right;
public RefType()
{
}
}
现在构建RefType类的实例时,left和right中的x和y字段的值是0还是10呢?C#编译器不允许值类型定义无参的构造器,所以编译不通过。
再看以下代码:
internal struct Point
{
public Int32 x=10;
}
编译也不能通过,因为我们不能用这种方式来初始化值类型的字段。
internal struct Point
{
public Int32 x, y;
public Point()
{
x = 10;
}
}
编译也不能通过,因为构造器必须初始化值类型的所有字段。
相关文章推荐
- C++基础实例-结构类型(3)
- 结构类型指针变量的使用实例
- 实例构造器,值类型构造器和类型构造器
- Sql2012如何将远程服务器数据库及表、表结构、表数据导入本地数据库 自定义日志记录功能,按日记录,很方便 C#常量和字段以及各种方法的语法总结 类型,对象,线程栈,托管堆在运行时的关系,以及clr如何调用静态方法,实例方法,和虚方法 asp.net webapi 自定义身份验证
- python判断类型:想知道一个对象(实例或者变量)是什么类型,什么结构的
- 类型实例的创建位置、托管对象在托管堆上的结构
- 实例构造器与类型构造器
- c# 值类型实例构造器
- 读<<CLR via C#>>总结(6) 详谈实例构造器和类型构造器
- SharePoint中的EventReceiver 之二 绑定Event Receiver到列表类型或列表实例
- python判断类型:想知道一个对象(实例或者变量)是什么类型,什么结构的
- 高通sensor架构实例分析之二(驱动代码结构)
- 实例构造器和类型构造器的一些比较
- C# 构造器-实例构造器,类型构造器
- 实例构造器与类型构造器
- 十九:构造器之一:实例构造器和类(引用类型)
- C#实例构造器,类型构造器 -笔记
- 【读】实例构造器和类型构造器的一些比较
- 实例构造器和类型构造器
- 类型实例的创建位置、托管对象在托管堆上的结构