Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#:更改数组的副本会更改数组本身_C#_Arrays - Fatal编程技术网

C#:更改数组的副本会更改数组本身

C#:更改数组的副本会更改数组本身,c#,arrays,C#,Arrays,我在C#中有一个非常基本的问题。因此,我有一个int数组,称为m_置换(类的属性),在该类的一个方法中,我有以下代码: int[] newPermutation = new int[m_permutation.Length]; newPermutation = m_permutation; newPermutation[0] = 5; 我不明白为什么在这段代码中m_排列也会改变,我该如何修复它 我知道我可以通过一个循环来初始化newPermutation,以获得相同的m

我在C#中有一个非常基本的问题。因此,我有一个int数组,称为m_置换(类的属性),在该类的一个方法中,我有以下代码:

    int[] newPermutation = new int[m_permutation.Length];
    newPermutation = m_permutation;
    newPermutation[0] = 5;
我不明白为什么在这段代码中m_排列也会改变,我该如何修复它

我知道我可以通过一个循环来初始化newPermutation,以获得相同的m_permutation值,这就解决了它。但是,有人能解释一下为什么会发生这种情况,最好的解决办法是什么

谢谢,


Bogdan

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

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

您对代码的期望既有好的一面,也有坏的一面

让我们看一下您的代码实际在做什么:

int[] newPermutation = new int[m_permutation.Length];
这将声明一个新变量,
newPermutation
,作为整数数组,然后构造一个包含
m_permutation.Length
元素的新整数数组

到目前为止还不错

下一行,不是那么多:

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

让我们考虑一个数组变量实际上是什么。< /P> 执行此操作时:

int[] x = new int[5];
然后你要做几件事:

  • 您正在声明一个变量,
    x
  • 您正在构造一个包含int数组的新对象
  • 您正在分配变量,
    x
    ,以引用此对象
  • 第二行之后:

    newPermutation = m_permutation;
    
    你基本上是这样说的:

  • 好的,你知道我们刚刚构建的数组吗?算了吧
  • 现在让我们参考另一个数组,变量
    m_permutation
    也指的数组
  • 因此,当这一行执行时:

    newPermutation[0] = 5;
    
    你的意思是:
    newPermutation
    现在引用的数组,它的第一个元素现在应该是值5

    由于此时
    newPermutation
    引用了与
    m_permutation
    相同的数组,因此您似乎在修改其他数组,但实际上您只有一个数组。但是,有两个变量引用同一数组

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

    但是,有一个简单的方法可以解决您的问题

    您可以请求阵列的副本,而不是对原始阵列的引用

    只需将代码更改为:

    int[] newPermutation = m_permutation.ToArray();
    
    .ToArray()
    方法保证返回新数组,因此不会与原始数组共享


    但是,请记住,如果对比int更复杂的对象(例如对象)执行此操作,则只能获得对象引用的副本,而不是对象本身。当/如果你说到这一点,你可以用新问题返回堆栈溢出。

    newPermutation=m\u permutation;这不是副本,只是另一个参考。要获取副本,请写入:newPermutation=m_permutation.ToArray();阅读参考变量@是的,刚刚开始。谢谢非常感谢您的代码,主要是对代码的清晰解释!回答得很好,解释得很好,也正是我要找的。所以罪魁祸首就是那个指针。