Tipos não gerenciados (referência C#)
Um tipo é um tipo não gerenciado se for qualquer um dos seguintes tipos:
sbyte
,byte
, ,short
,ushort
,uint
int
long
nint
ulong
, ounuint
char
float
double
decimal
bool
- Qualquer tipo de enum
- Qualquer tipo de ponteiro
- Uma tupla cujos membros são todos de um tipo não gerenciado
- Qualquer tipo struct definido pelo usuário que contenha apenas campos de tipos não gerenciados.
Você pode usar a unmanaged
restrição para especificar que um parâmetro type é um tipo não gerenciado não ponteiro e não anulável.
Um tipo struct construído que contém apenas campos de tipos não gerenciados também não é gerenciado, como mostra o exemplo a seguir:
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
Uma estrutura genérica pode ser a origem de tipos construídos não gerenciados e gerenciados. O exemplo anterior define uma struct Coords<T>
genérica e apresenta os exemplos de tipos construídos não gerenciados. O exemplo de um tipo gerenciado é Coords<object>
. Ele é gerenciado porque tem os campos do object
tipo, que é gerenciado. Se desejar que todos os tipos construídos sejam tipos não gerenciados, use a unmanaged
restrição na definição de uma estrutura genérica:
public struct Coords<T> where T : unmanaged
{
public T X;
public T Y;
}
Especificação da linguagem C#
Para obter mais informações, consulte a seção Tipos de ponteiro da especificação da linguagem C#.