非托管类型(C# 参考)
如果某个类型是以下类型之一,则它是非托管类型 :
sbyte
、byte
、short
、ushort
、int
、uint
、long
、ulong
、nint
、nuint
、char
、float
、double
、decimal
或bool
- 任何枚举类型
- 任何指针类型
- 成员都是某个非托管类型的一个元组
- 任何仅包含非托管类型字段的用户定义的结构类型。
可使用 unmanaged
约束指定:类型参数为“非指针、不可为 null 的非托管类型”。
仅包含非托管类型的字段的构造结构类型也是非托管类型,如以下示例所示:
using System;
public struct Coords<T>
{
public T X;
public T Y;
}
public class UnmanagedTypes
{
public static void Main()
{
DisplaySize<Coords<int>>();
DisplaySize<Coords<double>>();
}
private unsafe static void DisplaySize<T>() where T : unmanaged
{
Console.WriteLine($"{typeof(T)} is unmanaged and its size is {sizeof(T)} bytes");
}
}
// Output:
// Coords`1[System.Int32] is unmanaged and its size is 8 bytes
// Coords`1[System.Double] is unmanaged and its size is 16 bytes
泛型结构可以是非托管类型的源,也可以是托管构造类型的源。 前面的示例定义一个泛型结构 Coords<T>
,并提供非托管构造类型的示例。 托管类型的示例为 Coords<object>
。 它具有托管性质,因为它包含具托管性质的 object
类型的字段。 如果你希望所有 构造类型都是非托管类型,请在泛型结构的定义中使用 unmanaged
约束:
public struct Coords<T> where T : unmanaged
{
public T X;
public T Y;
}