何时使用ArraySegment <T> over Memory <T>?

Red*_*ood 5 c#

我正在研究将"视图"返回到一个非常大的数组中的最佳方法,并发现ArraySegment它非常适合我的需求.然而,我发现Memory<T>它似乎行为相同,但需要跨度来查看内存.

对于创建和写入大量(2GB +)数组的视图的用例,使用哪一个是否重要?

大数组的原因是它们保存图像的字节.

Şaf*_*Gür 12

万一有人遇到这个问题,就复活这个问题。

\n
\n

何时使用 ArraySegment 而不是 Memory?

\n
\n

永远不会,除非你需要调用一些需要 an 的旧东西ArraySegment<T>,我怀疑情况会是这样,因为它从来没有那么受欢迎。

\n

ArraySegment<T>只是一个数组、一个偏移量和一个长度,它们都直接公开,您可以选择忽略偏移量和长度,并根据需要访问整个数组。There\xe2\x80\x99s 也没有只读版本的ArraySegment<T>.

\n

Span<T>并且Memory<T>可以由数组支持,类似于ArraySegment<T>,但也可以由字符串和非托管内存支持(在 \xe2\x80\x99s 情况下以指针的形式,并在\xe2\x80\x99s 情况Span<T>下使用自定义)。它们通过不暴露底层数据源来提供更好的封装,并具有用于不可变访问的只读版本。MemoryManager<T>Memory<T>

\n

当时,我们必须将数组/偏移/计数三重奏传递给许多 API(需要直接引用数组的 API),但现在它已经存在,Span<T>并且Memory<T>得到大多数(如果不是全部).NET API 的广泛支持需要与连续的内存块交互,你应该没有理由使用ArraySegment<T>.

\n

另请参阅:内存和跨度相关类型 - MS Docs

\n