Compartilhar via


Tipos não gerenciados (referência de C#)

Um tipo é um tipo não gerenciado se for qualquer um dos seguintes tipos:

  • sbyte, byte, short, ushort, , int, uint, , long, ulong, nint, nuint, , char, float, double, ou decimalbool
  • Qualquer tipo de enumeração
  • Qualquer tipo de ponteiro
  • Uma tupla cujos membros são todos de um tipo não gerenciado
  • Qualquer tipo de 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 de tipo é um tipo não gerenciado sem ponteiro e não anulável.

Um tipo de struct construído que contém 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

Um struct genérico pode ser a origem de tipos construídos não 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 object tipo, que é gerenciado. Se você quiser que todos os tipos construídos sejam tipos não gerenciados, use a unmanaged restrição 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 obter mais informações, consulte a seção Tipos de ponteiro da especificação da linguagem C#.

Consulte também