C#中复制数组的两种常用方式及性能对比

花开有时
花开有时
发布时间:2026-10-15 | 3人浏览过
原创

在C#开发中,直接赋值仅实现引用传递而非数据复制。若需创建独立的数组实例(即深拷贝),通常使用 Array.Copy 或 Buffer.BlockCopy。本文通过具体代码示例对比两者用法,并结合基准测试说明在大数据量数值处理时 Buffer.BlockCopy 的性能优势。

基础操作:创建数组深拷贝

C# 中变量赋值默认是引用传递,即两个变量指向内存中的同一块托管堆区域。如需物理上创建一份独立副本以支持后续独立修改,必须调用特定的复制方法。常用的方式包括基于逻辑元素的 Array.Copy 和基于底层字节的 Buffer.BlockCopy。

第1步:使用Array.Copy实现基本复制

Array.Copy 适用于所有类型的数组,包含引用类型、值类型等通用场景。该方法是 C# 中最标准的数组拷贝方式。

class Program
{
    static void Main(string[] args)
    {
        // 定义源数组
        int[] a = { 1, 3, 6 };
        // 开辟同等大小的目标数组空间
        int[] b = new int[a.Length];
        
        // 执行从索引0到末尾的数据拷贝
        Array.Copy(a, 0, b, 0, a.Length);
        
        MyArrCopy myArrCopy = new MyArrCopy();
        myArrCopy.Display(b); // 显示新数组b的内容
        Console.ReadKey();
    }
}

public class MyArrCopy
{
    public void Display(int[] arr)
    {
        for (int i = 0; i < arr.Length; i++)
        {
            if (i != 0)
            {
                Console.Write(",");
            }
            Console.Write(arr[i]);
        }
    }
}

在上述操作中,b 被分配了新的内存地址,修改 b 不会影响到 a,成功实现了数据的隔离。

进阶优化:Buffer.BlockCopy的高频应用场景

在处理大量整数或浮点数等固定长度基元类型时,Buffer.BlockCopy 能够提供更优的执行速度。该方法直接在字节层面上进行内存拷贝,省去了部分装箱拆箱或边界检查开销。

第2步:设计性能对比测试环境

为了直观对比两者的时间开销,我们构造一个长度为 10,000 的大规模整型数组,并使用 Stopwatch 计时器记录两种拷贝方式的耗时差异。

public class CopyTest
{
    private int[] _myArr;          // 原始数据源
    private int[] _blockArr;       // Buffer.BlockCopy的目标缓冲区
    private int[] _copyArr;        // Array.Copy的目标缓冲区
    
    public CopyTest(int[] myArr)
    {
        _myArr = myArr;
        _blockArr = new int[myArr.Length];
        _copyArr = new int[myArr.Length];
    }
    
    // 测试BlockCopy效率
    public void TestBlockCopy()
    {
        System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
        sw.Start();
        // 参数:源数组、偏移字节、目标数组、偏移字节、拷贝长度(字节)
        Buffer.BlockCopy(_myArr, 0, _blockArr, 0, _myArr.Length * sizeof(int));
        sw.Stop();
        Console.WriteLine("Buffer.BlockCopy 耗时 ticks: " + sw.ElapsedTicks);
    }
    
    // 测试普通Array.Copy效率
    public void TestNormalCopy()
    {
        System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
        sw.Start();
        Array.Copy(_myArr, 0, _copyArr, 0, _myArr.Length);
        sw.Stop();
        Console.WriteLine("Array.Copy 耗时 ticks: " + sw.ElapsedTicks);
    }
}

第3步:执行客户端压测脚本

在主程序中初始化测试数据集并触发上述测试类的方法。运行后将得到不同方法的执行 Tick 数作为参考依据。

// 构建十万级别的压测数据
int[] largeData = new int[10000];
for (int i = 0; i < 10000; i++)
{
    largeData[i] = i;
}

var copyTest = new CopyTest(largeData);
copyTest.TestBlockCopy();
copyTest.TestNormalCopy();
Console.ReadKey();

通过控制台输出的 Tick 计数可以看出,针对纯整数类型且数据量庞大的场景下,Buffer.BlockCopy 由于其底层的字节搬运特性,往往能在相同时间内完成比 Array.Copy 更多的操作或者以更小的系统开销完成任务。当然需注意 Buffer.BlockCopy 仅在处理具有特定长度(如 byte, short, int, long, float, double 等)的数据结构时才能发挥最大效能,对于自定义类或其他复杂对象,请优先坚持使用 Array.Copy。

以上就是C#中数组复制两种方式及其效率对比的详细内容,更多关于C#高效数据处理与性能优化的资料请关注本站其它相关文章!

相关标签:

本站声明

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

Python 相关产品和应用

全部下载

专题列表