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 una estructura con diseño explícito. 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. El compilador acepta safe como modificador en extern miembros y campos de diseño explícito. Sin embargo, aún no hay ninguna participación pública para las reglas actualizadas de seguridad del autor de la llamada, por lo que el compilador no aplica la opción de seguridad que safe y unsafe expresa: omitir ambos modificadores no produce un error y ninguno cambia lo que los autores de llamada pueden hacer. Para seguir la característica, establezca la LangVersion opción previewdel compilador en . 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:

// Compiles under LangVersion preview, but the safety choice isn't enforced yet.
[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. La omisión de ambos modificadores está pensada para ser un error en el modelo actualizado, pero el compilador aún no aplica esa regla porque no hay ninguna participación pública para las reglas actualizadas.

Campos de diseño explícito

En un struct con [StructLayout(LayoutKind.Explicit)], los campos se pueden superponer en la memoria, por lo que el compilador no puede razonar sobre si una lectura a través de un campo es sonido. Marca todos los campos de este tipo de estructura o safeunsafe:

// Compiles under LangVersion preview, but the safety choice isn't enforced yet.
[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. Al igual que con extern los miembros, la omisión de ambos modificadores está pensada para ser un error en el modelo actualizado, pero el compilador aún no aplica esa regla.

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