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.
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à
Concetti
Riferimenti
Codice unsafe e puntatori (Guida per programmatori C#)