次のいずれかの型の場合、 型はアンマネージ 型です。
-
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;
}
C# 言語仕様
詳細については、C# 言語仕様の「ポインター型」セクションを参照してください。
こちらも参照ください
GitHub で Microsoft と共同作業する
このコンテンツのソースは GitHub にあります。そこで、issue や pull request を作成および確認することもできます。 詳細については、共同作成者ガイドを参照してください。
.NET