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,char,float,double,decimalobool- Cualquier tipo enum.
- Cualquier tipo pointer.
- Cualquier tipo de struct definido por el usuario que solo contenga campos de tipos no administrados, en C# 7.3 y versiones anteriores, no es un tipo construido (un tipo que incluya al menos un argumento de tipo)
A partir de C# 7.3, 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.
A partir C# 8.0, 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 no 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 no administrado es Coords<object>. No está administrado porque tiene los campos del tipo object, que es no 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#.