【问题标题】:C# : Changing copy of array changes array itselfC#:更改数组的副本会更改数组本身
【发布时间】:2018-04-28 21:15:41
【问题描述】:

我在 C# 中有一个非常基本的问题。所以我有一个名为 m_permutation(类的属性)的 int 数组,在类的方法中我有以下代码:

    int[] newPermutation = new int[m_permutation.Length];
    newPermutation = m_permutation;
    newPermutation[0] = 5;

我很困惑为什么 m_permutation 在这段代码中也发生了变化,我该如何解决?

我知道我可以通过 for 循环初始化 newPermutation,以获得相同的 m_permutation 值,然后修复它。但是,有人可以解释为什么会发生这种情况,最好的解决方法是什么?

谢谢,

波格丹

【问题讨论】:

  • newPermutation = m_permutation; 这不是副本,只是另一个参考。要获得副本写入:newPermutation = m_permutation.ToArray(); 请阅读参考变量!
  • @TaW 是的,刚刚开始。谢谢!

标签: c# arrays


【解决方案1】:

关于您对代码的期望,有好有坏。

让我们看看你的代码实际上在做什么:

int[] newPermutation = new int[m_permutation.Length];

这将声明一个新变量 newPermutation 为一个 int 数组,然后构造一个包含 m_permutation.Length 元素的新 int 数组。

到目前为止一切顺利。

下一行,没那么多:

newPermutation = m_permutation;

这一行实际上将替换数组变量newPermutation 中的引用,在赋值后引用与m_permutation 相同的数组。

让我们考虑一下数组变量实际上是什么。

当你这样做时:

int[] x = new int[5];

那么你正在做几件事:

  1. 您正在声明一个变量,x
  2. 您正在构造一个包含 int 数组的新 对象
  3. 您正在分配变量 x 来引用此对象

第二行之后:

newPermutation = m_permutation;

你实际上是在说:

  1. 好的,你知道我们刚刚构建的数组吗?忘记那个
  2. 现在让我们引用另一个数组,变量m_permutation 也引用这个数组。

所以当这行执行时:

newPermutation[0] = 5;

您实际上是在说:newPermutation 现在引用的数组,它的第一个元素现在应该具有值 5。

由于此时newPermutationm_permutation 引用相同的数组,看起来您正在修改一个额外的数组,但实际上您只有一个数组。但是,您确实有两个变量引用同一个数组。

我建议您阅读我关于指针的回答 here,因为这是相关的。

不过,有一个简单的方法可以解决您的问题。

您可以请求数组的副本,而不是对原始数组的引用。

只需将您的代码更改为:

int[] newPermutation = m_permutation.ToArray();

.ToArray() 方法保证返回一个 new 数组,因此不会与原始数组共享。

但是请记住,如果您使用比 int 更复杂的对象(例如对象)执行此操作,则您只会获得对象 references 的副本,而不是对象本身。当/如果您达到这一点,您可以带着新问题回到 Stack Overflow。

【讨论】:

  • 非常感谢您的代码,主要是为了清晰的解释!
  • 很好的答案,很好的解释,正是我正在寻找的东西。所以罪魁祸首是指针。
【解决方案2】:

因为它们都引用了内存中的同一个对象。 你可以使用,

Array.Copy(m_permutation, newPermutation,m_permutation.Length );

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-18
    • 1970-01-01
    • 2020-10-04
    • 2021-04-01
    • 1970-01-01
    • 2017-08-27
    • 2013-08-17
    • 2011-09-30
    相关资源
    最近更新 更多