在C#中如何在函数内修改数组且不改变原数组?
你之前的写法var newArray = array仅复制了数组的引用,两个变量指向堆中的同一块数组内存,修改任意一个的元素都会同步到另一个。要实现修改不影响原数组,需要先对原数组做数据拷贝,生成独立的新数组实例。
如果数组元素是值类型、或者像string这样的不可变引用类型,用浅拷贝即可满足需求,有以下几种常用实现方式:
- 方法1:使用
Array.Copy手动拷贝
代码示例:static void AddToArray(string[] array) { // 初始化同长度的新数组 string[] newArray = new string[array.Length]; // 全量拷贝原数组元素到新数组 Array.Copy(array, newArray, array.Length); // 修改新数组完全不影响原数组 newArray[2] = "y"; // 若需要使用修改后的数组,可将newArray作为返回值返回 } - 方法2:使用LINQ的
ToArray()方法(写法更简洁)
代码示例:// 需要先引入System.Linq命名空间 static void AddToArray(string[] array) { string[] newArray = array.ToArray(); newArray[2] = "y"; } - 方法3:使用数组实例的
Clone()方法
代码示例:static void AddToArray(string[] array) { string[] newArray = (string[])array.Clone(); newArray[2] = "y"; }
注意事项
如果数组存储的是可变的自定义类实例,上述浅拷贝仅会拷贝实例的引用,修改新数组中实例的属性仍会同步到原数组的对应元素,这种场景下需要对数组元素做深拷贝,实现方式可以是遍历数组逐个拷贝元素实例,或者通过序列化/反序列化的方式生成全量副本。
内容的提问来源于stack exchange,提问作者Diesel
相关产品推荐
相关产品推荐

