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>不是其他,我将如何决定什么最适合我的情况?
假设这个问题是关于 Memory/Span/array 而不是 Read/ReadAsync,那么这个例子中没有根本的区别。
不同之处在于 Memory/Span 是内存的抽象,有点像安全指针。它们可能代表常规的 C# 数组,但也可能代表非托管内存。它们也可能代表另一种类型的记忆。因此,如果某些代码将数据加载到字节数组中,您可以将其转换为整数数组,而无需进行大量复制。如果您不希望该方法访问所有数据,它还支持切片。
Memory 和 Span 之间的区别主要在于 Span 效率更高,但在使用方式上有一些限制。
因此,请使用适合您拥有的数据的任何内容。如果您正在设计 API,通常最好采用最通用的类型,即 Span/ReadonlySpan,并且为了方便起见,也许还可以添加重载或扩展方法。
| 归档时间: |
|
| 查看次数: |
7018 次 |
| 最近记录: |