Поделиться через


Неуправляемые типы (справочник по C#)

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

  • sbyte, byte, shortushortintuintlongulongnintnuintcharfloatdoubledecimalbool
  • Любой тип перечисления
  • Любой тип указателя
  • Кортеж, члены которого являются неуправляемым типом
  • Любой определяемый пользователем тип структуры , содержащий только поля неуправляемых типов.

Ограничение можно использовать 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#.

См. также