safe (Referencia de C#)

La safe palabra clave contextual marca una declaración como no requiere un unsafe contexto en su sitio de uso en el modelo de seguridad de memoria actualizado. El safe modificador es el homólogo de unsafe. No se requiere un contexto no seguro para los autores de llamadas de una safe declaración, mientras unsafe que propaga la obligación de auditar la seguridad al autor de la llamada.

El uso de la safe propia palabra clave requiere la AllowUnsafeBlocks opción del compilador (-unsafe), aunque los autores de llamadas no necesiten un unsafe contexto. Las declaraciones ordinarias son seguras de forma predeterminada, por lo que se omite safe dónde no es necesario evitar que se requiera innecesariamente una compilación no segura.

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.

Declaraciones permitidas y necesarias

Puede aplicar safe a las declaraciones que permiten un modificador no seguro requiere, incluidos métodos, constructores, propiedades y campos. Para las declaraciones ordinarias, el modificador puede hacer que el contrato previsto sea explícito, incluido en código fuente generado. No se limita a los miembros y a extern los campos de diseño.

Algunas declaraciones requieren una elección explícita de safe o unsafe cuando se habilitan las reglas actualizadas. En las secciones siguientes se describen extern los miembros y los campos de diseño explícitos o extendidos.

A diferencia unsafede , safe no establece un contexto léxico. No hace que las operaciones no seguras en un cuerpo miembro sean seguras ni cancele un contexto no seguro. No se pueden combinar los safe modificadores y unsafe en la misma declaración; si lo hace, genera la advertencia CS9388.

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