二十:构造器之二:实例构造器和结构(值类型)

本文探讨了C#中值类型和引用类型的构造机制。值类型不强制要求构造器,且CLR不会为值类型字段调用构造器。文章还讨论了如何正确初始化值类型,并避免编译错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

值类型不像引用类型那样,必须要有构造器,所以编译器不会为值类型生成无参构造器。如下代码:

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;

    }

}

编译也不能通过,因为构造器必须初始化值类型的所有字段。

 

 

转载于:https://www.cnblogs.com/chenzehe/archive/2009/01/31/1381669.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值