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.

A linguagem C# faz referência a documentos da versão mais recentemente lançada da linguagem C#. Ele também contém a documentação inicial para recursos em visualizações públicas para a próxima versão do idioma.

A documentação identifica qualquer recurso introduzido pela primeira vez nas três últimas versões do idioma ou nas versões prévias públicas atuais.

Dica

Para descobrir quando um recurso foi introduzido pela primeira vez em C#, consulte o artigo sobre o histórico de versão da linguagem C#.

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 definir tipos construídos não gerenciados e não gerenciados. O exemplo anterior define um struct Coords<T> genérico e apresenta 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