实例分析C#的对象分配,自己猜想

闲得没事,写下如下一段代码,借以分析一下C#中对象的分配。自己随便猜想的,不一定准确。

上面代码的输出如下图所示:

 

因为用过c++的缘故,我喜欢通过C++的对象分配方式来思考上述代码的输出结果。

若分析其结构, Point p1 = new Point(50, 50,"Point1");

在栈上分配一个指针p1,然后在堆上分配一个Point(50, 50,"Point1"),其中str指向在堆上分配的常量字符串“point1”。

Point p2 = (Point)p1.Clone();

此时,因为这里Clone的方法简单地用MemberwiseClone,所以简单地将(50, 50,"Point1")复制到堆上的一个新的位置,然后栈上的指针p2指向上述的新位置。

 

 p2.X = 100;  //p2指向地址的X修改100,此时并未影响p1
 p2.Str = "Point2"; //p2指向地址的str修改为“point2”,本来p1和p2的str都指向“point1",但是因为常量字符串不可改的特性,重新指定时,不是修改原指向堆中位置的值,而是指向一个新的位置,在新的位置分配新的字符串。

 

 

Point p3 = p1;  //p3指向“p1指向的位置”
p3.Str = "Point3"; // 因p1和p3指向的位置相同,所以修改p3指向位置的内容也就修改了p1指向位置的内容。p3.str 指向一个新的位置,实际也是p1.str指向了新的位置。

 

具体图形如下所示:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值