Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
La safe parola chiave contestuale attesta che una dichiarazione è valida in posizioni in cui il modello di sicurezza della memoria aggiornato richiede di rendere esplicita la scelta di sicurezza. Si applica safe come modificatore a una dichiarazione che il compilatore non può classificare autonomamente, ad esempio un extern membro o un campo in un tipo con layout esplicito o esteso. Il safe modificatore è la controparte di unsafe: safe attesta che i chiamanti non necessitano di contesto unsafe , mentre unsafe propaga l'obbligo di controllare la sicurezza al chiamante.
Importante
La safe parola chiave fa parte del modello aggiornato di sicurezza della memoria, una funzionalità di anteprima in C# 15 e .NET 11. Impostare LangVersion su preview per abilitare la sintassi. Per applicare anche le regole aggiornate, incluse le scelte esplicite safe o unsafe e gli obblighi del chiamante non sicuro, abilitare la funzionalità del updated-memory-safety-rules compilatore. Per informazioni dettagliate sull'attivazione, vedere Abilitare le regole di sicurezza della memoria aggiornate. Per la progettazione completa, vedere la specifica della funzionalità di sicurezza della memoria.
Membri extern
Un extern membro chiama nel codice nativo, in modo che il compilatore non possa classificarne la sicurezza. Nel modello aggiornato contrassegnare ogni extern dichiarazione, incluso un LibraryImport metodo parziale, 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 non accetta parametri e restituisce una primitiva, quindi l'autore attesta che la chiamata è sicura e i chiamanti lo usano senza un unsafe contesto.
strlen accetta un puntatore non elaborato che il codice nativo dereferenzia, quindi la dichiarazione è unsafe e propaga l'obbligo ai chiamanti. Con le regole aggiornate abilitate, l'omissione di entrambi i modificatori è un errore.
Campi di layout espliciti o estesi
In un tipo con [StructLayout(LayoutKind.Explicit)] o [ExtendedLayout], il compilatore non può classificare autonomamente la sicurezza di ogni campo dell'istanza. Ogni campo safe 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 che contiene un puntatore nativo o il cui tipo contiene in caso contrario un oggetto invariante che il sistema di tipi non può esprimere, è unsafe. Campo il cui tipo è descritto completamente dal sistema di tipi è safe. La stessa regola si applica ai campi di layout esplicito e ai campi di layout esteso. Come per extern i membri, l'omissione di entrambi i modificatori è un errore quando le regole aggiornate sono abilitate.
Specificazione del linguaggio C#
Per altre informazioni, vedere Codice unsafe nella specifica del linguaggio C#. La specifica del linguaggio costituisce il riferimento ufficiale principale per la sintassi e l'uso di C#.
Per la progettazione del modello di sicurezza della memoria aggiornato, vedere la specifica della funzionalità di sicurezza della memoria.