Partage via


Types non managés (référence C#)

Un type est un type non managé s’il s’agit de l’un des types suivants :

  • sbyte, byte, short, ushort, int, uint, long, ulong, nint, nuint, char, float, double, decimal ou bool
  • Tout type enum
  • Tout type pointer
  • Tuple dont les membres sont tous d’un type non managé
  • Tout type struct défini par l’utilisateur qui contient des champs de types non managés uniquement.

Vous pouvez utiliser la contrainte unmanaged pour spécifier qu’un paramètre de type est un type non managé non pointeur, non nullable.

Un type de struct construit qui contient des champs de types non managés uniquement n’est pas géré, comme le montre l’exemple suivant :

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 générique peut être la source des types construits non managés et managés. L’exemple précédent définit un struct Coords<T> générique et présente les exemples de types construits non managés. L’exemple d’un type managé est Coords<object>. Il est géré, car il possède les champs du type object, qui est géré. Si vous souhaitez que tous les types construits soient des types non managés, utilisez la contrainte unmanaged dans la définition d’un struct générique :

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

spécification du langage C#

Pour plus d’informations, consultez la section Types de pointeur de la Spécification du langage C#.

Voir aussi