我正在研究一些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,而不是复制值?
答案 0 :(得分:5)
您观察到的行为恰好在C#中结构化,因为:
在分配时复制结构。将结构分配给新变量时,将复制所有数据,并且对新副本的任何修改都不会更改原始副本的数据。在处理诸如Dictionary之类的值类型集合时,这一点很重要。 (source)
如果您希望引用存储在数组中的点,以便变量中的更改反映在数组中,则应使用类来表示点,而不是结构。
答案 1 :(得分:1)
这在内存方面是否浪费:不,将Point
等小对象存储为值类型(struct
)比引用类型(class
)更便宜。引用类型的大小将包括引用本身(对于x64为8个字节),对象头(我认为为8个字节)和数据本身,对于值类型,只有值的成本。
备注