Справочник по C#. Неуправляемые типы

Тип является неуправляемым типом, если он принадлежит к одному из следующих типов:

  • sbyte, byte, short, ushort, int, uint, long, ulong, char, float, double, decimal или bool;
  • любой тип перечисления;
  • любой тип указателя.
  • Любой определенный пользователем тип структуры, который содержит поля только неуправляемых типов в C# 7.3 и более ранних версиях, не является сконструированным типом (тип, который включает по крайней мере один аргумент типа)

Начиная с C# 7.3 можно использовать ограничение unmanaged, чтобы указать, что параметр типа является отличным от указателя неуправляемым типом, не допускающим значения NULL.

Начиная с C# 8.0, сконструированный тип структуры, содержащий поля только неуправляемых типов, также является неуправляемым, как показано в следующем примере:

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#.

См. также