如何让Stream兼容Span<T>?.NET标准/核心2.0环境技术求助
关于Span在.NET Core 2.0/.NET Standard 2.0中使用的问题解答
嘿,我刚梳理完你的问题,这其实是个很典型的版本兼容问题——咱们拆成两个核心点来聊:
为什么Stream不接受Span?
你当前用的.NET Core 2.0和.NET Standard 2.0里,Stream类的Read/Write方法还只支持传统的byte[]参数,直接接受Span<byte>的重载是在.NET Core 2.1才正式加入框架的。哪怕你自己实现了Span<T>,框架原生的Stream并没有适配这个类型的方法。
解决办法分两种:
- 优先推荐:升级到.NET Core 2.1或更高版本,升级后你就能直接用
Stream.Read(Span<byte>)和Stream.Write(ReadOnlySpan<byte>),完全享受Span的零分配优势。 - 如果暂时不能升级:可以把
Span<byte>转成byte[]再传给Stream,比如用buffer.ToArray(),但这样会产生额外的内存分配,失去了Span最核心的性能优势。
为什么找不到int.Parse的Span重载?
同样是版本的限制——int.Parse(ReadOnlySpan<char>)这个重载是在.NET Core 2.1和.NET Standard 2.1才引入的,所以在你当前的环境里确实没有这个方法。
解决思路和上面一致:
- 升级到支持的版本后,就能直接这么用:
ReadOnlySpan<char> numSpan = "12345".AsSpan(); int result = int.Parse(numSpan); - 无法升级的话,只能把Span转成string再解析:
同样,这个转换过程会有额外的内存分配。ReadOnlySpan<char> numSpan = "12345".AsSpan(); int result = int.Parse(numSpan.ToString());
额外提醒:关于System.Memory包
你在.NET Standard 2.0里能使用SpanSystem.Memory NuGet包对吧?但这个包只提供了Span
举个升级后的完整代码示例:
// .NET Core 2.1+ 环境下的用法 using System; using System.IO; class Program { static void Main() { // Stream和Span<byte>的配合 using var stream = new MemoryStream(); Span<byte> buffer = stackalloc byte[512]; // 写入数据 var data = "Hello Span!".AsBytes(); stream.Write(data); stream.Position = 0; // 读取数据 int bytesRead = stream.Read(buffer); // int.Parse和Span<char>的配合 ReadOnlySpan<char> numText = "6789".AsSpan(); int number = int.Parse(numText); Console.WriteLine(number); } }
内容的提问来源于stack exchange,提问作者Christopher James Woods
相关产品推荐
相关产品推荐

