在C#编程中,数组的复制是一个非常基础但又容易被误解的操作。很多初学者在处理数组时,常常以为直接赋值就能实现“复制”,结果却导致两个变量指向同一个内存地址,修改一个会影响另一个。本文将详细讲解C#中两种常用的数组复制方法:CopyTo 和 Clone,帮助你彻底掌握C#数组复制的核心技巧。
先来看一个错误示例:
int[] arr1 = { 1, 2, 3, 4 };int[] arr2 = arr1; // 这不是复制!只是引用arr2[0] = 99;Console.WriteLine(arr1[0]); // 输出:99
可以看到,修改 arr2 会直接影响 arr1,因为它们指向的是同一块内存。这就是所谓的“浅引用”。要真正复制数组内容,必须使用专门的方法,比如 CopyTo 或 Clone。
CopyTo 是 Array 类的一个实例方法,用于将当前数组的元素复制到另一个已存在的数组中。
int[] source = { 10, 20, 30, 40 };int[] destination = new int[4];source.CopyTo(destination, 0); // 从索引0开始复制destination[0] = 999;Console.WriteLine(source[0]); // 输出:10(未受影响)Console.WriteLine(destination[0]); // 输出:999
注意:CopyTo 要求目标数组必须已经分配了足够的空间,否则会抛出异常。此外,它执行的是浅拷贝——对于引用类型数组(如对象数组),复制的只是引用,而不是对象本身。
Clone 方法返回一个新数组,其内容是原数组的副本。它是 ICloneable 接口的一部分。
int[] original = { 1, 2, 3 };int[] cloned = (int[])original.Clone();cloned[0] = 888;Console.WriteLine(original[0]); // 输出:1Console.WriteLine(cloned[0]); // 输出:888
和 CopyTo 一样,Clone 也是执行浅拷贝。这意味着如果你的数组元素是引用类型(例如自定义类的对象),那么新旧数组中的元素仍然指向同一个对象实例。
理解 数组深拷贝浅拷贝 的区别非常重要:
在 C# 中,CopyTo 和 Clone 都属于浅拷贝。如果需要深拷贝,通常需要手动实现(例如通过序列化)或使用第三方库。
- 如果你只需要复制值类型数组(如 int[]、double[]),使用 Clone() 最简单。
- 如果你已有目标数组并希望控制复制起始位置,使用 CopyTo() 更灵活。
- 对于引用类型数组,务必注意 C# CopyTo方法 和 C# Clone方法 都不会创建新对象,仅复制引用。
- 如需完全独立的副本(深拷贝),请考虑使用 JsonSerializer、BinaryFormatter(已弃用)或其他深拷贝技术。
希望这篇关于 C#数组复制 的教程能帮助你避免常见陷阱,写出更健壮的代码!如果你觉得有用,欢迎分享给其他正在学习 C# 的朋友。
本文由主机测评网于2025-12-21发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://vpshk.cn/20251210750.html