fixed

Références

L'actualité

Librairie

L'information

fixed

L'instruction fixed empêche le récupérateur de mémoire de déplacer une variable mobile. L'instruction fixed est uniquement autorisée dans un contexte unsafe. fixed peut également être utilisé pour créer des mémoires tampons de taille fixe.

L'instruction fixed définit un pointeur vers une variable managée et épingle cette variable pendant l'exécution de l'instruction. Les pointeurs vers des variables managées ne sont utiles que dans un contexte fixed. Sans contexte fixed, le garbage collector peut déplacer les variables de manière imprévisible. Le compilateur C# permet seulement d'assigner un pointeur à une variable managée dans une instruction fixed.

Vous pouvez initialiser un pointeur à l'aide d'un tableau, d'une chaîne, d'un tampon de taille fixe ou de l'adresse d'une variable. L'exemple suivant montre l'utilisation des adresses de variables, des tableaux et des chaînes.

à compter de C# 7.3, l'instruction fixed s'applique à d'autres types au-delà des tableaux, chaînes, mémoires tampons de taille fixe ou variables non managées. Tout type qui implémente une méthode nommée GetPinnableReference peut être épinglé. GetPinnableReference doit retourner une variable ref d'un type non géré.

Les types .NET System.Span‹T› et System.ReadOnlySpan‹T› introduits dans .NET Core 2.0 utilisent ce modèle et peuvent être épinglés. Ceci est illustré dans l'exemple suivant :

Si vous créez des types qui doivent être inclus dans ce modèle, consultez Span‹T›.GetPinnableReference() pour obtenir un exemple d'implémentation du modèle.

Plusieurs pointeurs peuvent être initialisés dans une instruction s'ils sont tous du même type :

Pour initialiser des pointeurs de types différents, imbriquez des instructions fixed, comme indiqué dans l'exemple suivant.

Une fois que le code de l'instruction est exécuté, toutes les variables épinglées sont libérées et soumises au garbage collector. Par conséquent, ne pointez pas vers ces variables en dehors de l'instruction fixed. La portée des variables déclarées dans l'instruction fixed est limitée à cette instruction, ce qui facilite les choses :

Les pointeurs initialisés dans des instructions fixed sont des variables en lecture seule. Pour modifier la valeur du pointeur, vous devez déclarer une deuxième variable de pointeur et la modifier. La variable déclarée dans l'instruction fixed ne peut pas être modifiée :

En mode unsafe, vous pouvez allouer de la mémoire sur la pile, où elle n'est pas soumise au garbage collector et n'a donc pas besoin d'être épinglée.