safe (Riferimenti per C#)

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 uno struct con layout esplicito. 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. Il compilatore in .NET 11 Preview 5 non riconosce ancora la parola chiave. Per seguire la funzionalità, impostare l'opzione del LangVersion compilatore su preview. Per la progettazione completa, vedere la specifica della funzionalità di sicurezza della memoria. Il codice in questo articolo mostra la sintassi proposta e non viene compilata con il compilatore di anteprima corrente.

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:

// Preview: illustrates the updated model, which the current compiler doesn't enforce yet.
[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. L'omissione di entrambi i modificatori è un errore, che forza a prendere la decisione di sicurezza.

Campi di layout esplicito

In uno struct con [StructLayout(LayoutKind.Explicit)]i campi possono sovrapporsi in memoria, quindi il compilatore non può ragionarsi se un campo letto attraverso un campo è audio. È possibile contrassegnare ogni campo di tale struct safe o unsafe:

// Preview
[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. Come per extern i membri, l'omissione di entrambi i modificatori è un errore.

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.

Vedere anche