Tipos não gerenciados (referência em C#)Unmanaged types (C# reference)

Um tipo é um tipo não gerenciado , se for qualquer um dos seguintes tipos:A type is an unmanaged type if it's any of the following types:

  • sbyte, byte, short, ushort, int, uint, long, ulong, char, float, double, decimal ou boolsbyte, byte, short, ushort, int, uint, long, ulong, char, float, double, decimal, or bool
  • Qualquer tipo de EnumeraçãoAny enum type
  • Qualquer tipo de ponteiroAny pointer type
  • Qualquer tipo de struct definido pelo usuário que contém campos de tipos não gerenciados somente e, em C# 7,3 e anterior, não é um tipo construído (um tipo que inclui pelo menos um argumento de tipo)Any user-defined struct type that contains fields of unmanaged types only and, in C# 7.3 and earlier, is not a constructed type (a type that includes at least one type argument)

A partir do C# 7,3, você pode usar a unmanaged restrição para especificar que um parâmetro de tipo é um tipo não gerenciado não-ponteiro e não anulável.Beginning with C# 7.3, you can use the unmanaged constraint to specify that a type parameter is a non-pointer, non-nullable unmanaged type.

A partir do C# 8,0, um tipo struct construído que contém campos de tipos não gerenciados também é não gerenciado, como mostra o exemplo a seguir:Beginning with C# 8.0, a constructed struct type that contains fields of unmanaged types only is also unmanaged, as the following example shows:

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 fonte de tipos construídos não gerenciados e não gerenciados.A generic struct may be the source of both unmanaged and not unmanaged constructed types. O exemplo anterior define uma struct genérica Coords<T> e apresenta os exemplos de tipos construídos não gerenciados.The preceding example defines a generic struct Coords<T> and presents the examples of unmanaged constructed types. O exemplo de não é um tipo não gerenciado Coords<object> .The example of not an unmanaged type is Coords<object>. Não é não gerenciado porque tem os campos do object tipo, que não são gerenciados.It's not unmanaged because it has the fields of the object type, which is not unmanaged. Se você quiser que todos os tipos construídos sejam tipos não gerenciados, use a unmanaged restrição na definição de uma estrutura genérica:If you want all constructed types to be unmanaged types, use the unmanaged constraint in the definition of a generic struct:

public struct Coords<T> where T : unmanaged
{
    public T X;
    public T Y;
}

Especificação da linguagem C#C# language specification

Para saber mais, confira a seção Tipos de ponteiro na Especificação da linguagem C#.For more information, see the Pointer types section of the C# language specification.

Confira tambémSee also