Tipos no administrados (referencia de C#)

Un tipo es un tipo no administrado si es cualquiera de los siguientes tipos:

  • sbyte, byte, short, ushort, int, uint, long, ulong, nint, nuint, char, float, double, decimal o bool
  • Cualquier tipo enum.
  • Cualquier tipo pointer.
  • Una tupla cuyos miembros son todos de un tipo no administrado
  • Cualquier tipo struct definido por el usuario que solo contenga campos de tipos no administrados.

Puede usar unmanagedconstraint para especificar que un parámetro de tipo es un tipo no administrado que no acepta valores NULL y que no es de puntero.

Un tipo de struct construido que solo contenga campos de tipos no administrados también es no administrado, como se muestra en el ejemplo siguiente:

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

Un struct genérico puede ser el origen de los tipos no administrados y de los tipos construidos administrados. En el ejemplo anterior se define un struct Coords<T> genérico y se presentan los ejemplos de tipos construidos no administrados. El ejemplo de un tipo administrado es Coords<object>. Es administrado porque tiene los campos del tipo object, que está administrado. Si desea que todos los tipos construidos sean tipos no administrados, use la restricción unmanaged en la definición de un struct genérico:

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

Especificación del lenguaje C#

Para obtener más información, vea la sección Tipos de puntero de Especificación del lenguaje C#.

Consulte también