Codice safe e unsafe (confronto tra C# e Java)

Aggiornamento: novembre 2007

Una funzionalità particolarmente interessante di C# è il supporto del codice non indipendente dai tipi. In genere è CLR (Common Language Runtime) che si occupa di controllare il funzionamento del codice MSIL (Microsoft Intermediate Language), impedendo l'esecuzione di operazioni non sicure. In alcuni casi, può tuttavia essere necessario accedere direttamente a funzionalità di basso livello, ad esempio le chiamate API Win32, e si è autorizzati a procedere, purché si garantisca che il codice funzioni correttamente. Questo codice deve essere inserito all'interno di blocchi unsafe nel codice sorgente.

Parola chiave unsafe

Il codice C# che effettua chiamate API di basso livello, utilizza l'aritmetica dei puntatori o esegue altre operazioni non sicure deve essere inserito in blocchi contrassegnati dalla parola chiave unsafe. È possibile contrassegnare come unsafe gli elementi riportati di seguito:

  • Un intero metodo.

  • Un blocco di codice tra parentesi graffe.

  • Una singola istruzione.

Nell'esempio riportato di seguito viene illustrato come utilizzare la parola chiave unsafe in tutte e tre le situazioni sopra indicate:

class TestUnsafe
{
    unsafe static void PointyMethod()
    {
        int i=10;

        int *p = &i;
        System.Console.WriteLine("*p = " + *p);
        System.Console.WriteLine("Address of p = {0:X2}\n", (int)p);
    }

    static void StillPointy()
    {
        int i=10;

        unsafe
        {
            int *p = &i;
            System.Console.WriteLine("*p = " + *p);
            System.Console.WriteLine("Address of p = {0:X2}\n", (int)p);
        }
    }

    static void Main()
    {
        PointyMethod();
        StillPointy();
    }
}

In questo codice viene contrassegnato come unsafe l'intero metodo PointyMethod() poiché dichiara e utilizza puntatori. Il metodo StillPointy() contrassegna un blocco di codice come unsafe poiché anche questo blocco utilizza puntatori.

Parola chiave fixed

Nel codice safe, il Garbage Collector è praticamente libero di spostare un oggetto per tutto il suo ciclo di vita, al fine di organizzare e comprimere le risorse non allocate. Se tuttavia il codice utilizza puntatori, questo comportamento può facilmente produrre risultati imprevisti, pertanto è possibile utilizzare l'istruzione fixed per indicare al Garbage Collector di non spostare alcuni oggetti.

Nel codice riportato di seguito viene illustrato l'utilizzo della parola chiave fixed per garantire che una matrice non venga spostata dal sistema durante l'esecuzione di un blocco di codice nel metodo PointyMethod(). Si noti che la parola chiave fixed viene utilizzata soltanto all'interno del codice unsafe:

class TestFixed
{
    public static void PointyMethod(char[] array)
    {
        unsafe
        {
            fixed (char *p = array)
            {
                for (int i=0; i<array.Length; i++)
                {
                    System.Console.Write(*(p+i));
                }
            }
        }
    }

    static void Main()
    {
        char[] array = { 'H', 'e', 'l', 'l', 'o' };
        PointyMethod(array);
    }
}

Vedere anche

Attività

Esempio di codice unsafe

Concetti

Guida per programmatori C#

Riferimenti

Codice unsafe e puntatori (Guida per programmatori C#)

Altre risorse

Linguaggio di programmazione C# per sviluppatori Java