读取流:Byte[] vs Memory<Byte> vs Span<Byte>

cog*_*el0 11 .net c# .net-core

以下之间的根本区别是什么:

var buffer = new byte[8192];
var bytesRead = Stream.Read(buffer, 0, buffer.Length);
Run Code Online (Sandbox Code Playgroud)
var buffer = new byte[8192];
var span = new Span<byte>(buffer);
var bytesRead = Stream.Read(span);
Run Code Online (Sandbox Code Playgroud)
var buffer = new byte[8192];
var memory = new Memory<byte>(buffer);
var bytesRead = Stream.ReadAsync(memory).Result;
Run Code Online (Sandbox Code Playgroud)

排除一个明显的事实,即它们都是不同的对象类型,并且唯一Stream.Read()接受 a 的方法当然Memory<Byte>是。ReadAsync()

为什么我会选择其中任何一个byte[]Span<byte>Memory<byte>不是其他,我将如何决定什么最适合我的情况?

Jon*_*asH 4

假设这个问题是关于 Memory/Span/array 而不是 Read/ReadAsync,那么这个例子中没有根本的区别。

不同之处在于 Memory/Span 是内存的抽象,有点像安全指针。它们可能代表常规的 C# 数组,但也可能代表非托管内存。它们也可能代表另一种类型的记忆。因此,如果某些代码将数据加载到字节数组中,您可以将其转换为整数数组,而无需进行大量复制。如果您不希望该方法访问所有数据,它还支持切片。

Memory 和 Span 之间的区别主要在于 Span 效率更高,但在使用方式上有一些限制。

因此,请使用适合您拥有的数据的任何内容。如果您正在设计 API,通常最好采用最通用的类​​型,即 Span/ReadonlySpan,并且为了方便起见,也许还可以添加重载或扩展方法。