.NET框架中的Span <T>和流

Rad*_*asa 4 .net c# .net-4.7.1

我正在使用网络缓冲区和流,并且“跨度和内存”将非常适合应用程序需求。

根据这个问题,我想让一个Stream接受Span作为参数。我知道它是在.NET Core 2.1中实现的,但是我想知道是否还有一种方法可以在.NET Framework中获得此功能?(我正在使用4.7.1)

就像是:

Span<Byte> buffer = new Span<byte>();
stream.Read(buffer);
Run Code Online (Sandbox Code Playgroud)

Rad*_*asa 5

我设法通过为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); }
    }
Run Code Online (Sandbox Code Playgroud)

    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); }
    }
Run Code Online (Sandbox Code Playgroud)

  • @Tomy `SR` 是 Microsoft 的大多数 .NET 程序集中的“内部静态类”;“SR”是“String resources”的缩写,它是 `ResourceManager` 的速记包装器,用于检索本地化的异常消息。 (2认同)