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 ou bool
  • Todo tipo enumerado
  • Todo tipo ponteiro
  • 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#.

Confira também