safe (référence C#)

Le safe mot clé contextuel atteste qu’une déclaration est sonore dans les endroits où le modèle de sécurité de mémoire mis à jour vous oblige à rendre le choix de sécurité explicite. Vous appliquez safe en tant que modificateur sur une déclaration que le compilateur ne peut pas classifier par lui-même, tel qu’un extern membre ou un champ d’un type avec une disposition explicite ou étendue. Le safe modificateur est l’équivalent de unsafe: safe atteste que les appelants n’ont pas unsafe besoin de contexte, tout en unsafe propageant l’obligation d’auditer la sécurité à l’appelant.

Important

Le safe mot clé fait partie du modèle de sécurité de mémoire mis à jour, une fonctionnalité d’aperçu en C# 15 et .NET 11. Définissez cette option LangVersion pour preview activer la syntaxe. Pour appliquer également les règles mises à jour, y compris des choix explicites safe ou unsafe des choix et des obligations d’appelants non sécurisés, activez la fonctionnalité du updated-memory-safety-rules compilateur. Pour plus d’informations sur l’activation, consultez Activer les règles de sécurité de mémoire mises à jour. Pour obtenir la conception complète, consultez la spécification de la fonctionnalité de sécurité de la mémoire.

Membres extern

Un extern membre appelle du code natif afin que le compilateur ne puisse pas classifier sa sécurité. Sous le modèle mis à jour, vous marquez chaque extern déclaration, y compris une LibraryImport méthode partielle, soit safeunsafe:

// Syntax requires LangVersion preview; enforcement requires the updated-memory-safety-rules compiler feature.
[LibraryImport("libc")]
internal static safe partial int getpid();

[LibraryImport("libc", StringMarshalling = StringMarshalling.Utf8)]
internal static unsafe partial nint strlen(byte* str);

getpid n’accepte aucun paramètre et retourne une primitive, de sorte que l’auteur atteste que l’appel est sécurisé et que les appelants l’utilisent sans unsafe contexte. strlen prend un pointeur brut que le code natif déréférence, de sorte que la déclaration est unsafe et propage l’obligation à ses appelants. Avec les règles mises à jour activées, l’omission des deux modificateurs est une erreur.

Champs de disposition explicites ou étendus

Dans un type avec [StructLayout(LayoutKind.Explicit)] ou [ExtendedLayout], le compilateur ne peut pas classifier la sécurité de chaque champ d’instance par lui-même. Vous marquez chaque champ de ce type ou safeunsafe:

// Syntax requires LangVersion preview; enforcement requires the updated-memory-safety-rules compiler feature.
[StructLayout(LayoutKind.Explicit)]
internal struct Union
{
    [FieldOffset(0)]
    internal safe int AsInt;

    [FieldOffset(0)]
    internal safe float AsFloat;
}

Champ qui contient un pointeur natif, ou dont le type porte sinon une invariante que le système de type ne peut pas exprimer, est unsafe. Champ dont le type est entièrement décrit par le système de type .safe La même règle s’applique aux champs de disposition explicite et aux champs de disposition étendue. Comme pour extern les membres, l’omission des deux modificateurs est une erreur lorsque les règles mises à jour sont activées.

Spécification du langage C#

Pour plus d’informations, consultez Code non sécurisé dans la spécification du langage C#. La spécification du langage est la source de référence pour la syntaxe C# et son utilisation.

Pour la conception du modèle de sécurité de mémoire mis à jour, consultez la spécification de la fonctionnalité de sécurité de la mémoire.

Voir aussi