【问题标题】:Can I create a new array reference which contains a subset of an existing array, without copying memory?我可以在不复制内存的情况下创建一个包含现有数组子集的新数组引用吗?
【发布时间】:2012-12-24 15:45:13
【问题描述】:

我正在用 C# 构建一个文件阅读器,会枚举大量数据。我想为我读出的每个元素使用相同的缓冲区,然后传递缓冲区以供客户端进一步处理。如果我可以返回正确大小的byte[],而不是原始缓冲区和长度,API 会更简洁。

是否可以在不复制内存的情况下在 C# 中执行此操作?

【问题讨论】:

  • 传递一个基于原始缓冲区的某个区域的MemoryStream 怎么样?

标签: c# arrays memory buffer subset


【解决方案1】:

ArraySegment 类型是一个通用结构,它允许我们存储有关数组范围的信息。它对于存储数组范围很有用。 ArraySegment 有助于减少内存复制和堆分配的优化。

来自MSDN

Array 属性返回整个原始数组,而不是 数组;因此,对 Array 返回的数组所做的更改 属性被添加到原始数组中。

这是DEMO

【讨论】:

    【解决方案2】:

    你可以使用ArraySegment<T>

    http://msdn.microsoft.com/en-us/library/1hsbd92d.aspx

    这使您可以在不复制任何数据的情况下指定要传递的段的开始和结束。

    【讨论】:

      【解决方案3】:

      如果您可以更改 API 参数类型,我认为您可以使用 ArraySegment

      【讨论】:

        猜你喜欢
        • 2021-02-24
        • 1970-01-01
        • 1970-01-01
        • 2010-11-25
        • 2023-02-11
        • 1970-01-01
        • 2016-11-04
        • 1970-01-01
        相关资源
        最近更新 更多