次の方法で共有


アンマネージド型 (C# リファレンス)

型は、次のいずれかの型である場合、アンマネージド型です。

  • sbytebyteshortushortintuintlongulongnintnuintcharfloatdoubledecimal、または bool
  • すべての列挙
  • すべてのポインター
  • メンバーがすべてアンマネージド型であるタプル
  • アンマネージ型のフィールドのみを含むユーザー定義の struct 型。

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;
}

C# 言語仕様

詳しくは、「C# 言語仕様」の「ポインター型」をご覧ください。

関連項目