C#:更改数组的副本会更改数组本身
我在C#中有一个非常基本的问题。因此,我有一个int数组,称为m_置换(类的属性),在该类的一个方法中,我有以下代码:C#:更改数组的副本会更改数组本身,c#,arrays,C#,Arrays,我在C#中有一个非常基本的问题。因此,我有一个int数组,称为m_置换(类的属性),在该类的一个方法中,我有以下代码: int[] newPermutation = new int[m_permutation.Length]; newPermutation = m_permutation; newPermutation[0] = 5; 我不明白为什么在这段代码中m_排列也会改变,我该如何修复它 我知道我可以通过一个循环来初始化newPermutation,以获得相同的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
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();阅读参考变量@是的,刚刚开始。谢谢非常感谢您的代码,主要是对代码的清晰解释!回答得很好,解释得很好,也正是我要找的。所以罪魁祸首就是那个指针。