繁体   English   中英

跨度 <T> 和溪流

[英]span<T> and streams

我现在已经阅读了一段时间的跨度,并试图实现它。 然而,虽然我可以得到跨度工作,但我无法弄清楚如何让流接受它,就像他们在示例中所做的那样。 其他示例也显示了int.parse支持跨度,但我找不到使其成为可能的重载或扩展。

我在.net Standard 2.0和.net core 2.0中都尝试过它。

请指出我正确的方向来完成这项工作。

编辑:代码示例将是:

    Span<Byte> buffer = new Span<byte>();
    int bytesRead = stream.Read(buffer);

.NET Core 2.1支持来自流的跨度结果。 如果检查例如Stream的当前源代码,您将看到它有读取(Span)读取为Span<byte>而不是byte[]重载,或者可以写出ReadOnlySpan<byte> Write(ReadOnlySpan)。而不是byte[] ,使用内存等的重载。

要以.NET Core 2.1为目标,您必须至少安装Visual Studio 2017 15.7 Preview 4最新的SDK for .NET Core 2.1

让我们看一个我很方便的例子,其中Span<T>恰好来自PipeWriter

var bufferSpan = pipeWriter.GetSpan(count);
stream.Write( /* Darn, I need an array, because no Span<T> overloads outside Core 2.1! */ );

尝试获取Memory<T>而不是Span<T> ,您可以获得底层数组(除了在某些特殊情况下)。

var bufferMemory = pipeWriter.GetMemory(count); // Instead of GetSpan()
var bufferArraySegment = bufferMemory.GetUnderlyingArray();
stream.Write(bufferArraySegment.Array, bufferArraySegment.Offset, bufferArraySegment.Count); // Yay!

GetUnderlyingArray()这里是一个小扩展方法:

/// <summary>
/// Memory extensions for framework versions that do not support the new Memory overloads on various framework methods.
/// </summary>
internal static class MemoryExtensions
{
    public static ArraySegment<byte> GetUnderlyingArray(this Memory<byte> bytes) => GetUnderlyingArray((ReadOnlyMemory<byte>)bytes);
    public static ArraySegment<byte> GetUnderlyingArray(this ReadOnlyMemory<byte> bytes)
    {
        if (!MemoryMarshal.TryGetArray(bytes, out var arraySegment)) throw new NotSupportedException("This Memory does not support exposing the underlying array.");
        return arraySegment;
    }
}

总而言之,这使您可以将具有“现代”返回类型的方法与“旧”框架重载结合使用 - 无需任何复制。 :)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM