實例分析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指向了新的位置。

 

具體圖形如下所示:

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章