unsafe (Riferimenti per C#)

La unsafe parola chiave indica un contesto non sicuro, necessario per qualsiasi operazione che coinvolge puntatori. Per altre informazioni, vedere Codice e puntatori unsafe.

Il riferimento al linguaggio C# documenta la versione rilasciata più di recente del linguaggio C#. Contiene anche la documentazione iniziale per le funzionalità nelle versioni di anteprima pubblica per la prossima versione del linguaggio di programmazione.

La documentazione identifica tutte le funzionalità introdotte nelle ultime tre versioni della lingua o nelle anteprime pubbliche correnti.

Suggerimento

Per trovare quando una funzionalità è stata introdotta per la prima volta in C#, vedere l'articolo sulla cronologia delle versioni del linguaggio C#.

Usare il unsafe modificatore nella dichiarazione di un tipo o di un membro. L'intero extent testuale del tipo o del membro è un contesto non sicuro. Ad esempio, il metodo seguente viene dichiarato con il unsafe modificatore:

unsafe static void FastCopy(byte[] src, byte[] dst, int count)
{
    // Unsafe context: can use pointers here.
}

L'ambito del contesto unsafe si estende dall'elenco di parametri alla fine del metodo, quindi è anche possibile usare i puntatori nell'elenco di parametri:

unsafe static void FastCopy ( byte* ps, byte* pd, int count ) {...}

È anche possibile usare un blocco unsafe per abilitare l'uso di codice non sicuro all'interno di questo blocco. Per esempio:

unsafe
{
    // Unsafe context: can use pointers here.
}

Per compilare codice non sicuro, è necessario specificare l'opzione del compilatore AllowUnsafeBlocks . Common Language Runtime non è in grado di verificare il codice non sicuro.

Note

La funzionalità di anteprima della sicurezza della memoria disponibile in C# 15 restringe le operazioni che richiedono un unsafe contesto. Un unsafe contesto non è più necessario per la creazione di un puntatore, l'istruzione, la fixed conversione di un'espressione stackalloc in un puntatore e l'uso sizeof in un tipo non gestito. Solo le operazioni che accedono alla memoria a punta, ad esempio riferimento indiretto del puntatore, richiedono comunque un unsafe contesto. La stessa anteprima aggiunge anche un modulo che stabilisce un unsafe(expression) contesto non sicuro per una singola espressione, per le posizioni in cui un unsafe blocco non può essere visualizzato, ad esempio un inizializzatore di campo o un catch filtro. Per altre informazioni, vedere Espressioni unsafe. L'anteprima fornisce anche al unsafe modificatore su un membro un nuovo significato: contrassegna il membro richiede unsafe. Impostare LangVersion su preview per la nuova sintassi e i relax del puntatore. Per applicare anche 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.

Example

// compile with: -unsafe
class UnsafeTest
{
    // Unsafe method: takes pointer to int.
    unsafe static void SquarePtrParam(int* p)
    {
        *p *= *p;
    }

    unsafe static void Main()
    {
        int i = 5;
        // Unsafe method: uses address-of operator (&).
        SquarePtrParam(&i);
        Console.WriteLine(i);
    }
}
// Output: 25

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#.

Vedere anche