我可以得到一个跨度的指针吗?

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),但是我不能传递一个范围,也没有找到另一个处理指针(和范围)的方法。

这有可能吗?如果是,怎么办?

Jer*_*ert 9

如果您具有C#7.3或更高版本,则可以使用对该fixed语句进行的扩展,该扩展可以GetPinnableReference在类型(具有SpanReadOnlySpan具有)上使用任何适当的方法:

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)