通过引用而不是值将对象传递到数组中

时间:2014-08-29 03:28:19

标签: c# arrays ref

我正在研究一些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数组之后,对数据的更改没有反映在数组中,这告诉我数组包含原始Points的副本,而不是Points本身。这在内存方面是否浪费,如果是这样,有没有办法让数组引用Points,而不是复制值?

2 个答案:

答案 0 :(得分:5)

您观察到的行为恰好在C#中结构化,因为:

  

在分配时复制结构。将结构分配给新变量时,将复制所有数据,并且对新副本的任何修改都不会更改原始副本的数据。在处理诸如Dictionary之类的值类型集合时,这一点很重要。 (source

如果您希望引用存储在数组中的点,以便变量中的更改反映在数组中,则应使用类来表示点,而不是结构。

答案 1 :(得分:1)

这在内存方面是否浪费:不,将Point等小对象存储为值类型(struct)比引用类型(class)更便宜。引用类型的大小将包括引用本身(对于x64为8个字节),对象头(我认为为8个字节)和数据本身,对于值类型,只有值的成本。

备注