闲得没事,写下如下一段代码,借以分析一下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指向了新的位置。
具体图形如下所示: