【问题标题】:Passing objects into an array by reference instead of value通过引用而不是值将对象传递到数组中
【发布时间】:2014-10-23 01:14:09
【问题描述】:

我正在编写一些 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 struct,还是System.Drawing.Point
  • @Blorgbeard 这是System.Drawing.Point

标签: c# arrays ref


【解决方案1】:

您观察到的行为发生在 C# 中的结构上,原因是:

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

如果您想引用存储在数组中的点,以便变量中的更改反映在数组中,您应该为点使用类,而不是结构。

【讨论】:

    【解决方案2】:

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

    注意事项

    【讨论】:

      猜你喜欢
      • 2018-08-17
      • 2021-09-11
      • 2016-04-18
      • 2011-09-30
      • 2020-07-28
      • 1970-01-01
      • 2017-01-27
      • 1970-01-01
      • 2011-09-27
      相关资源
      最近更新 更多