gpt4 book ai didi

c# - 如何在没有不安全关键字的情况下获取结构的 Span View

转载 作者:太空狗 更新时间:2023-10-29 17:54:32 24 4
gpt4 key购买 nike

Span<byte>怎么能 View (重新解释转换)是从单个结构值创建的,没有复制,没有分配,并且没有不安全关键字。

我目前只能使用 unsafe 关键字来完成此操作:

public unsafe Span<byte> AsSpan<T>(in T val) where T : unmanaged
{
void* valPtr = Unsafe.AsPointer(ref Unsafe.AsRef(val));
return new Span<byte>(valPtr, Marshal.SizeOf<T>());
}

// Alternatively, slightly easier when using 'ref' instead of 'in'
public unsafe Span<byte> AsSpan<T>(ref T val) where T : unmanaged
{
void* valPtr = Unsafe.AsPointer(ref val);
return new Span<byte>(valPtr, Marshal.SizeOf<T>());
}

当处理数组而不是单个值时 - 使用 MemoryMarshal.Cast<TTo, TFrom>( ... ) 可以轻松安全地完成此操作,例如:

public Span<byte> AsSpan<T>(Span<T> vals) where T : unmanaged
{
return MemoryMarshal.Cast<T, byte>(vals);
}

使用netstandard2.0,最新语言版本C# 7.3 ,以及 System.Memory 的最新 RC 包和 System.Runtime.CompilerServices.Unsafe :

<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<LangVersion>7.3</LangVersion>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="System.Memory" Version="4.5.0" />
<PackageReference Include="System.Runtime.CompilerServices.Unsafe" Version="4.5.0" />
</ItemGroup>

编辑:关于内存安全/损坏的回复 - unmanaged C# 7.3 中引入的通用约束可以替换 struct通用约束并允许以内存安全的方式完成此操作。

参见:https://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/generics/constraints-on-type-parameters

where T : unmanaged The type argument must not be a reference type and must not contain any reference type members at any level of nesting.

最佳答案

部分解决方案:

如果目标是 netcoreapp 而不是 netstandard2.0,则 netcoreapp2.1 中有一个可用的 API(截至本评论日期可下载 here)。


用法:

using System.Runtime.InteropServices;

public Span<byte> AsSpan<T>(ref T val) where T : unmanaged
{
Span<T> valSpan = MemoryMarshal.CreateSpan(ref val, 1);
return MemoryMarshal.Cast<T, byte>(valSpan);
}

这不是在 netstandard2.0 中要求此功能的问题的解决方案。尽管如此,这对许多偶然发现此问题的人应该有所帮助。

关于c# - 如何在没有不安全关键字的情况下获取结构的 Span<byte> View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50285147/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com