【发布时间】:2019-08-06 21:42:50
【问题描述】:
是否可以在不复制到数组的情况下从Memory<byte> 创建struct?或者更好的是,创建共享相同托管内存的struct 和Memory<byte>?
Reading a C/C++ data structure in C# from a byte array 非常接近但不太适用。 Memory<T> 有一个Pin 方法,但它返回一个MemoryHandle 而不是GCHandle。
XY:我正在从套接字读取和写入Memory<byte>,在从切片获得的跨度上使用BinaryPrimitives 来获取和设置各个字段。将Memory 表示为struct 会更好。
【问题讨论】:
-
您可以使用
MemoryMarshall.Cast将Span<byte>转换为Span<struct>而无需复制字节 - 至少,我认为这是(非常糟糕的文档)现在的语法。 -
手动操作内存在 C# 中极为罕见。您通常会尽可能避免使用它,当某个特定接口强制您使用它时,您会立即将其转换为更典型的数据类型以供使用。您似乎违反了这些规范,但您这样做的理由却没有得到很好的解释。特别是,我不明白您为什么不直接将一些
byte[]写入套接字而不是操作内存。也不清楚您实际上是否在进行我提到的转换,这让人想知道 C# 是否是解决您问题的好语言。 -
@jpmc26 我不确定它是否如此不寻常。 .NET Core 开发人员显然决定使用
SocketAsyncEventArgs的首选方法是使用Memory<byte>而不是byte[]作为缓冲区。讨论的 API here 存在于 2.2 中,尽管没有记录。事实上,SetBuffer的几个未记录的重载将它们的参数转换为Memory<byte>并设置MemoryBuffer属性而不是旧的Buffer属性。 -
@jpmc26 一般而言,
Memory<byte>和Span<byte>使用起来好多。整个标准 API 似乎都倾向于使用它们而不是byte[]。只是文档跟不上。