Справочник по C#. Неуправляемые типы
Тип является неуправляемым типом, если он принадлежит к одному из следующих типов:
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#.