Partilhar via


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, uintintlongnintulong, ou nuintcharfloatdoubledecimalbool
  • 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#.

Consulte também