在 Memory<byte> 中复制/设置单个字节

4
我正在使用C#中的System.Buffers.MemoryPool<T>System.Memory<T>,旨在减少字节数组的分配。
我有一堆字节和字节数组,需要将它们复制到一个单独的字节数组中(用于只能处理byte[]而非Span/Memory的方法)。我正在做类似以下的事情:
byte aByte = 0x01;
byte[] aByteArray = { 0x02, 0x03, 0x04 };
byte[] anotherByteArray = { 0x05, 0x06, 0x07 };

using (var buffer = MemoryPool<byte>.Shared.Rent(7))
{
    Span<byte> target;

    target = buffer.Memory.Slice(0, aByteArray.Length).Span;
    aByteArray.CopyTo(target);

    target = buffer.Memory.Slice(aByteArray.Length, anotherByteArray.Length).Span;
    aByteArray.CopyTo(target);

    // How to copy a single byte?
}

所以,我已经弄清楚如何将字节数组复制到缓冲区中,但是无法弄清如何设置单个字节。我尝试过buffer.Memory.Span[0] = aByte,但Span没有setter。


1
buffer.Memory.Span[0] = aByte; 对我有效。 - GSerg
1
有趣的是,我只查看了索引器的文档:https://learn.microsoft.com/en-us/dotnet/api/system.span-1.item?view=netcore-2.2#System_Span_1_Item_System_Int32_。它说索引器可以用于获取和设置,但是索引器的声明显示它只有一个getter。也许较新版本的.NET Core有setter,而旧版本没有。我不知道... - user2819245
请确保您不会以任何方式使用IReadOnlyMemory/IReadOnlySpan。 - Kevin Gosse
2
Getter是返回引用的,所以您不需要setter,并且不能为返回引用的属性定义setter。此外,我在.NET Framework或.NET Core中使用它没有任何问题。如果您尝试使用它时出现任何编译错误,则应将其添加到问题中。 - user4003407
1
@PetSerAl 哎呀,你说得对 - 编译时没有错误,只是在 Visual Studio 中显示... ReSharper 又提醒我了! - Cocowalla
显示剩余2条评论
1个回答

1

在阅读了@PetSerAl的评论后,我进行了检查,实际上没有编译时错误 - 只有Visual Studio中显示的警告。ReSharper可能存在错误。

我应该想到这一点,因为ReSharper以前在新的C#功能(例如Span<T>Memory<T>)方面曾经让我失望过:/


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接