2014-08-29 74 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

相关问题