C# 数组拷贝的5种方法及注意事项

沿途有光
沿途有光
发布时间:2026-10-13 | 6人浏览过
原创

在 C# 编程中,数组是引用类型,这意味着直接赋值仅传递引用而非数据副本。本文将详细解析数组拷贝的5种方法,包括循环赋值、CopyTo、Array.Copy、Clone以及引用传递陷阱,帮助开发者选择合适的拷贝策略以避免内存或逻辑错误。

核心概念:引用类型与值类型

首先需要明确的是,在 C# 中数组属于引用类型。如果仅仅是通过赋值语句(如 int[] b = a;)来“拷贝”数组,实际上只是将另一个变量指向了同一个内存地址。此时对其中一个数组的修改会直接影响另一个。真正的拷贝需要在堆中开辟新空间,确保数据独立。

五种数组拷贝方法详解

第1步:使用 for 循环逐个元素赋值

这是最基础且直观的方法。通过遍历原数组,将每个元素的值逐个复制到新创建的数组中。

int[] pins = { 9, 3, 7, 2 };
int[] copy = new int[pins.Length];

for (int i = 0; i < copy.Length; i++)
{
    copy[i] = pins[i];
}

特点: 适用于任何类型的数组,尤其是多维数组或需要自定义拷贝逻辑的场景。性能相对较慢,但可控性最强。

第2步:使用 Array.CopyTo 方法

CopyTo 是数组实例提供的一个便捷方法,可以将当前数组的内容复制到另一个已有的一维 Array 中。

int[] copy = new int[pins.Length];
pins.CopyTo(copy, 0); // 第二个参数指定目标数组的起始索引

特点: 简洁高效,但要求目标数组必须预先分配好空间,且只能用于一维数组。

第3步:直接赋值(引用传递陷阱)

这种方式严格来说不是“拷贝”,而是创建了一个新的引用指向原数组。

int[] alias = pins;

警告: 仅当确实需要两个变量共享同一份数据时才使用此法。若后续对 alias 进行修改,pins 也会随之改变。这通常被视为拷贝时的常见错误。

第4步:使用 Array.Copy 静态方法

Array.Copy 是最常用的底层拷贝方法,支持不同数据类型之间的转换拷贝。

int[] copy = new int[pins.Length];
Array.Copy(pins, copy, pins.Length);
// 签名通常为: Array.Copy(source, destination, length)

特点: 功能强大,支持部分拷贝(指定长度和偏移量),性能优异。是推荐的标准做法之一。

第5步:使用 Clone 方法

数组实现了 ICloneable 接口,可以通过 Clone 方法创建一个新的数组对象。

int[] copy = (int[])pins.Clone();

注意: Clone() 返回的是 object 类型,因此必须进行强制类型转换。该方法执行的是浅拷贝(Shallow Copy),对于值类型数组完全安全;但对于引用类型数组(如 int[][] 或类数组),内部元素仍共享引用。

总结与选型建议

  • 简单一维值类型数组: 推荐使用 Array.Copy 或 Clone,代码简洁且性能良好。
  • 复杂逻辑或多维数组: 建议使用 for 循环进行精确控制。
  • 避免意外: 除非有意共享数据,否则严禁使用直接赋值 = 进行数组操作。

以上就是 C# 数组拷贝方法的详细内容,更多关于 C# 数组操作技巧的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表