C#中修改数组副本却改变原数组的原因及解决方法
为什么修改newPermutation会影响m_permutation?怎么解决?
嘿,这个问题我刚学C#的时候也踩过一模一样的坑!核心原因是数组是引用类型,不是值类型。你看这段代码:
int[] newPermutation = new int[m_permutation.Length]; newPermutation = m_permutation; // 关键坑就在这一行! newPermutation[0] = 5;
第二行的newPermutation = m_permutation并没有把原数组的内容复制到你刚创建的新数组里,而是把newPermutation这个变量的引用指向了m_permutation所在的内存地址。说白了,现在两个变量其实指向同一个数组对象,你改其中一个的元素,另一个自然也会跟着变——因为它们根本就是同一个东西!
除了你已经知道的for循环手动复制,还有这些更简洁高效的方案:
使用
Array.Copy()方法:这是.NET提供的专门用于数组复制的高效方法,处理大数组时性能表现很好:int[] newPermutation = new int[m_permutation.Length]; Array.Copy(m_permutation, newPermutation, m_permutation.Length);使用数组的
Clone()方法:数组实现了ICloneable接口,调用Clone()会返回一个浅拷贝的新数组。对于int这种值类型数组,浅拷贝就完全够用:int[] newPermutation = (int[])m_permutation.Clone();使用LINQ的
ToArray()方法:如果你的项目引用了System.Linq命名空间,可以用这种更清爽的写法(底层本质还是遍历复制,但代码更简洁):using System.Linq; // 记得先添加这个命名空间引用 int[] newPermutation = m_permutation.ToArray();使用数组的
CopyTo()方法:和Array.Copy()逻辑类似,只是调用方式不同:int[] newPermutation = new int[m_permutation.Length]; m_permutation.CopyTo(newPermutation, 0); // 第二个参数是目标数组的起始索引
总结一下:只要让newPermutation指向一个独立的新数组对象,并且把原数组的元素逐个复制进去,就能彻底避免修改新数组影响原数组的问题啦~
内容的提问来源于stack exchange,提问作者redfiloux
相关产品推荐
相关产品推荐

