safe (Referencia de C#)

La safe palabra clave contextual atestigua que una declaración es sólida en lugares donde el modelo de seguridad de memoria actualizado requiere que la elección de seguridad sea explícita. Se aplica safe como modificador en una declaración que el compilador no puede clasificar por sí mismo, como un extern miembro o un campo de un tipo con diseño explícito o extendido. El safe modificador es el homólogo de unsafe: safe atestigua que los autores de llamadas no necesitan contexto unsafe , mientras unsafe propaga la obligación de auditar la seguridad al autor de la llamada.

Importante

La safe palabra clave forma parte del modelo de seguridad de memoria actualizado, una característica en versión preliminar de C# 15 y .NET 11. Establézcalo LangVersion en preview para habilitar la sintaxis. Para aplicar también las reglas actualizadas, incluidas las opciones o unsafe explícitas safe y las obligaciones de llamador no seguras, habilite la updated-memory-safety-rules característica del compilador. Para obtener más información sobre la activación, consulte Habilitación de las reglas de seguridad de memoria actualizadas. Para obtener el diseño completo, consulte la especificación de características de seguridad de memoria.

Miembros extern

Un extern miembro llama al código nativo, por lo que el compilador no puede clasificar su seguridad. En el modelo actualizado, marca cada extern declaración, incluido un LibraryImport método parcial, ya sea safe o unsafe:

// 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 no toma parámetros y devuelve un primitivo, por lo que el autor atestigua que la llamada es segura y los autores de llamadas lo usan sin contexto unsafe . strlen toma un puntero sin procesar que el código nativo desreferencia, por lo que la declaración es unsafe y propaga la obligación a sus autores de llamada. Con las reglas actualizadas habilitadas, la omisión de ambos modificadores es un error.

Campos de diseño explícitos o extendidos

En un tipo con [StructLayout(LayoutKind.Explicit)] o [ExtendedLayout], el compilador no puede clasificar la seguridad de cada campo de instancia por sí mismo. Marca cada campo de safe este tipo o unsafe:

// 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;
}

Un campo que contiene un puntero nativo o cuyo tipo de otro modo lleva una invariable que el sistema de tipos no puede expresar, es unsafe. Un campo cuyo tipo se describe por completo por el sistema de tipos es safe. La misma regla se aplica a los campos de diseño explícito y a los campos de diseño extendido. Al igual que con extern los miembros, omitir ambos modificadores es un error cuando se habilitan las reglas actualizadas.

Especificación del lenguaje C#

Para obtener más información, vea Código no seguro en la especificación del lenguaje C#. La especificación del lenguaje es el origen definitivo de la sintaxis y el uso de C#.

Para conocer el diseño del modelo de seguridad de memoria actualizado, consulte la especificación de características de seguridad de memoria.

Consulte también