Tipos não gerenciados (referência em C#)
Um tipo é um tipo não gerenciado se for um dos seguintes:
sbyte
,byte
,short
,ushort
,int
,uint
,long
,ulong
,nint
,nuint
,char
,float
,double
,decimal
oubool
- Todo tipo enumerado
- Todo tipo ponteiro
- Uma tupla cujos membros são todos de um tipo não gerenciado
- Qualquer tipo struct definido pelo usuário que contenha somente campos de tipos não gerenciados.
Você pode usar a restrição unmanaged
para especificar que um parâmetro de tipo é um tipo não gerenciado, não ponteiro e não anulável.
Um tipo de struct construído que contém campos somente de tipos não gerenciados também é do tipo não gerenciado, como mostra o seguinte exemplo:
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
Um struct genérico pode ser a fonte de tipos construídos gerenciados e não gerenciados. O exemplo anterior define um struct Coords<T>
genérico 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 tipo object
, não gerenciados. Se você quiser que todos os tipos construídos sejam do tipo não gerenciado, use a restrição unmanaged
na definição de um struct genérico:
public struct Coords<T> where T : unmanaged
{
public T X;
public T Y;
}
Especificação da linguagem C#
Para saber mais, confira a seção Tipos de ponteiro na Especificação da linguagem C#.