我正在处理网络缓冲区和流,Span 和 Memory 非常适合应用程序要求。
根据 this问题,我想让一个 Stream 接受 Span 作为参数。我知道这是在 .NET Core 2.1 中实现的,但我想知道是否也有办法在 .NET Framework 中获得此功能? (我用的是4.7.1)
类似于:
Span<Byte> buffer = new Span<byte>();
stream.Read(buffer);
最佳答案
我设法通过为 Stream 类编写扩展方法并实现 .NET Core 处理 Span 的默认行为来解决这个问题。
public static int Read(this Stream thisStream, Span<byte> buffer)
{
byte[] sharedBuffer = ArrayPool<byte>.Shared.Rent(buffer.Length);
try
{
int numRead = thisStream.Read(sharedBuffer, 0, buffer.Length);
if ((uint)numRead > (uint)buffer.Length)
{
throw new IOException(SR.IO_StreamTooLong);
}
new Span<byte>(sharedBuffer, 0, numRead).CopyTo(buffer);
return numRead;
}
finally { ArrayPool<byte>.Shared.Return(sharedBuffer); }
}
和
public static void Write(this Stream thisStream, ReadOnlySpan<byte> buffer)
{
byte[] sharedBuffer = ArrayPool<byte>.Shared.Rent(buffer.Length);
try
{
buffer.CopyTo(sharedBuffer);
thisStream.Write(sharedBuffer, 0, buffer.Length);
}
finally { ArrayPool<byte>.Shared.Return(sharedBuffer); }
}
关于c# - .NET 框架中的 Span<T> 和流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53759949/