我可以创建一个包含现有数组子集的新数组引用,而无需复制内存吗?

时间:2013-01-10 09:43:58

标签: c# arrays memory buffer subset

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

是否可以在C#中执行此操作而无需复制内存?

3 个答案:

答案 0 :(得分:7)

您可以使用ArraySegment<T>

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

这使您可以指定要传递的段的开头和结尾,而无需复制任何数据。

答案 1 :(得分:4)

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

答案 2 :(得分:1)

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

来自 MSDN ;

  

Array属性返回整个原始数组,而不是副本   阵列;因此,对Array返回的数组所做的更改   属性是原始数组。

这是DEMO