我正在研究将"视图"返回到一个非常大的数组中的最佳方法,并发现ArraySegment
它非常适合我的需求.然而,我发现Memory<T>
它似乎行为相同,但需要跨度来查看内存.
对于创建和写入大量(2GB +)数组的视图的用例,使用哪一个是否重要?
大数组的原因是它们保存图像的字节.
Şaf*_*Gür 12
万一有人遇到这个问题,就复活这个问题。
\n\n\n何时使用 ArraySegment 而不是 Memory?
\n
永远不会,除非你需要调用一些需要 an 的旧东西ArraySegment<T>
,我怀疑情况会是这样,因为它从来没有那么受欢迎。
ArraySegment<T>
只是一个数组、一个偏移量和一个长度,它们都直接公开,您可以选择忽略偏移量和长度,并根据需要访问整个数组。There\xe2\x80\x99s 也没有只读版本的ArraySegment<T>
.
Span<T>
并且Memory<T>
可以由数组支持,类似于ArraySegment<T>
,但也可以由字符串和非托管内存支持(在 \xe2\x80\x99s 情况下以指针的形式,并在\xe2\x80\x99s 情况Span<T>
下使用自定义)。它们通过不暴露底层数据源来提供更好的封装,并具有用于不可变访问的只读版本。MemoryManager<T>
Memory<T>
当时,我们必须将数组/偏移/计数三重奏传递给许多 API(需要直接引用数组的 API),但现在它已经存在,Span<T>
并且Memory<T>
得到大多数(如果不是全部).NET API 的广泛支持需要与连续的内存块交互,你应该没有理由使用ArraySegment<T>
.
另请参阅:内存和跨度相关类型 - MS Docs
\n