Nicht verwaltete Typen (C#-Verweis)

Ein Typ ist ein nicht verwalteter Typ, wenn es sich um einen der folgenden Typen handelt:

  • sbyte, byte, short, ushort, int, uint, long, ulong, char, float, double, decimal oder bool
  • Beliebiger Enumerationstyp
  • Beliebiger Zeigertyp
  • Jeder benutzerdefinierte Strukturtyp , der nur Felder von nicht verwalteten Typen enthält.

Sie können die unmanaged Einschränkung verwenden, um anzugeben, dass ein Typparameter ein Nicht-Zeiger, nicht nullabler nicht verwalteter Typ ist.

Ein konstruierter Strukturtyp, der Felder von nicht verwalteten Typen enthält, ist ebenfalls nicht verwaltet, wie das folgende Beispiel zeigt:

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

Eine generische Struktur kann die Quelle sowohl nicht verwalteter als auch verwalteter erstellter Typen sein. Das oben stehende Beispiel definiert die generische Struktur Coords<T> und zeigt Beispiele nicht verwalteter konstruierter Typen. Das Beispiel eines verwalteten Typs ist Coords<object>. Es wird verwaltet, da er über die Felder des object Typs verfügt, die verwaltet werden. Wenn alle konstruierten Typen nicht verwaltet sein sollen, verwenden Sie die unmanaged-Einschränkung in der Definition einer generischen Struktur:

public struct Coords<T> where T : unmanaged
{
    public T X;
    public T Y;
}

C#-Sprachspezifikation

Weitere Informationen finden Sie im Abschnitt Zeigertypen der Spezifikation für die Sprache C#.

Siehe auch