You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:23:21