2014-08-29 29 views
0

我正在一些C#代碼,並有8個點,這正在付諸6個陣列,每一個具有類似於下面的示例不同的組合:傳遞對象到一個數組通過引用而不是值

Point pt10 = new Point(10,10); 
Point pt20 = new Point(20,20); 
Point pt30 = new Point(30,30); 

Point[] ptArr1 = {pt10, pt20}; 
Point[] ptArr2 = {pt10, pt30}; 

然後我注意到,在初始化Point數組後,點的更改沒有反映在數組中,這就告訴我數組包含原始點的副本,而不是Point本身。這是浪費的內存方面,如果是這樣,有沒有辦法讓數組引用點,而不是複製值?

+0

這是你自己的'Point'結構,還是它是'System.Drawing.Point'? – Blorgbeard 2014-08-29 03:33:11

+0

@Blorgbeard它是'System.Drawing.Point' – Shadow 2014-08-29 03:39:49

回答

1

內存方面是否浪費:不,存儲像Point這樣的小對象作爲值類型(struct)比參考類型(class)更便宜。引用類型的大小將包含引用本身(x64的8個字節),對象頭(我認爲是8個字節)和數據本身,對於值類型,只有值的成本。

5

你觀察到的行爲發生在C#結構,是因爲:

結構是在分配複製。將結構分配給新變量時,將複製所有數據,並且對新副本的任何修改都不會更改原始副本的數據。在處理諸如Dictionary之類的值類型集合時,記住這一點很重要。 (source

如果你想擁有存儲陣列中的點的引用,因此,在變量的變化反映在數組中,你應該使用分一類,而不是一個結構。

+1

你打敗了我... – Mrchief 2014-08-29 03:45:20

相關問題