如何在不使用 unsafe 关键字的情况下,从单个结构体值创建一个
使用 netstandard2.0,最新的语言版本 C# 7.3,以及最新的RC包 System.Memory 和 System.Runtime.CompilerServices.Unsafe:
编辑: 关于内存安全/损坏的回复 - C# 7.3中引入的
请参见:https://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/generics/constraints-on-type-parameters
Span<byte>
视图(重解释型转换),且无需复制、无需分配内存。目前我只能使用 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,以及最新的RC包 System.Memory 和 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>
编辑: 关于内存安全/损坏的回复 - C# 7.3中引入的
unmanaged
泛型约束可以替代struct
泛型约束,以安全的方式完成此操作。请参见:https://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/generics/constraints-on-type-parameters
where T : unmanaged
类型参数不能是引用类型,并且在任何嵌套级别上也不能包含任何引用类型成员。
byte[]
,就无法实现这个功能了吗? - joe