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

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

在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 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。