Ray*_*Ray 5 c# .net-4.6 .net-standard-2.0 .net-core-2.1
我有一个(ReadOnly)Span<byte>要从中解码字符串的对象。
仅在.NET Core 2.1中,我有了新的重载,可以从其中解码一个字符串,而无需复制字节:
Encoding.GetString(ReadOnlySpan<byte> bytes);
Run Code Online (Sandbox Code Playgroud)
在.NET Standard 2.0和.NET 4.6(我也想支持)中,我只有经典的重载:
Encoding.GetString(byte[] bytes);
Encoding.GetString(byte* bytes, int byteCount);
Run Code Online (Sandbox Code Playgroud)
第一个需要将字节的副本复制到我要避免的数组中。
第二个需要一个字节指针,所以我考虑从我的跨度中获取一个,例如
Encoding.GetString(Unsafe.GetPointer<byte>(span.Slice(100)))
Run Code Online (Sandbox Code Playgroud)
...但是我没有找到一个实际的方法。我试过了void* Unsafe.AsPointer<T>(ref T value),但是我不能传递一个范围,也没有找到另一个处理指针(和范围)的方法。
这有可能吗?如果是,怎么办?
如果您具有C#7.3或更高版本,则可以使用对该fixed语句进行的扩展,该扩展可以GetPinnableReference在类型(具有Span和ReadOnlySpan具有)上使用任何适当的方法:
fixed (byte* bp = bytes) {
...
}
Run Code Online (Sandbox Code Playgroud)
unsafe当然,在处理指针时,这需要上下文。
C#7.0到7.2没有此功能,但允许以下操作:
fixed (byte* bp = &bytes.GetPinnableReference()) {
...
}
Run Code Online (Sandbox Code Playgroud)