Aller au contenu

where T unmanaged (pas de références)

Contexte : La contrainte unmanaged (disponible depuis C# 7.3) exige que le paramètre de type soit un type non managé : c’est‑à‑dire un type valeur ne contenant aucune référence à un objet managé (pas de champs de type référence). Cela inclut les types primitifs, les énumérations, les structs composés uniquement de champs non managés. Cette contrainte est utile pour l’interopérabilité avec du code non managé (P/Invoke, allocations sur la pile, etc.).

using System;
using System.Runtime.InteropServices;
public struct PointNonManage
{
public int X;
public int Y;
// Pas de champs référence
}
public struct PointAvecReference
{
public int X;
public string Description; // référence => non autorisé
}
public class BufferUnmanaged<T> where T : unmanaged
{
public unsafe T* Allouer(int count)
{
return (T*)Marshal.AllocHGlobal(count * sizeof(T));
}
}
class Program
{
static void Main()
{
var buffer = new BufferUnmanaged<PointNonManage>();
Console.WriteLine("Buffer non managé créé (simulation)");
// Ceci ne compile pas : PointAvecReference contient une référence
// var bufferErreur = new BufferUnmanaged<PointAvecReference>();
}
}
Fenêtre de terminal
dotnet run
Buffer non managé créé (simulation)
  • Les types unmanaged sont un sous‑ensemble des struct.
  • Permet d’utiliser sizeof(T) et stackalloc T[].
  • Idéal pour les APIs haute performance ou l’interopérabilité.

System.Span<T> – Utilise des contraintes unmanaged en interne pour certaines optimisations.
Voir documentation .NET sur la contrainte unmanaged.