Código seguro y no seguro (C# y Java)
Actualización: noviembre 2007
Una característica particularmente interesante de C# es la compatibilidad con el código no seguro. Normalmente, Common Language Runtime (CLR) asume la responsabilidad de supervisar el comportamiento del código de lenguaje intermedio de Microsoft (MSIL) y evita cualquier operación cuestionable. No obstante, en ocasiones puede ser conveniente tener acceso directamente a una funcionalidad de nivel inferior, como llamadas a la API Win32, y se puede hacer siempre y cuando se asuma la responsabilidad de garantizar que ese código funcione correctamente. Ese código se debe colocar dentro de bloques no seguros en el código fuente.
La palabra clave unsafe
El código de C# que efectúa llamadas a la API de nivel inferior, utiliza aritmética de punteros o realiza alguna otra operación poco segura, se debe colocar dentro de bloques marcados con la palabra clave unsafe. Cualquiera de las siguientes situaciones se puede marcar como no segura:
Un método completo.
Un bloque de código entre llaves.
Una instrucción individual.
El ejemplo siguiente muestra el uso de unsafe en las tres situaciones anteriores:
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();
}
}
En este código, el método PointyMethod() completo está marcado como no seguro porque declara y utiliza punteros. El método StillPointy() marca un bloque de código como no seguro porque este bloque una vez más utiliza punteros.
La palabra clave fixed
En código seguro, el recolector de elementos no utilizados tiene bastante libertad para mover un objeto durante su duración con la misión de organizar y condensar recursos libres. Sin embargo, si el código utiliza punteros, este comportamiento puede producir fácilmente resultados inesperados; por lo tanto, puede indicar al recolector de elementos no utilizados que no mueva determinados objetos mediante la instrucción fixed.
En el código siguiente se muestra la palabra clave fixed, que se utiliza para garantizar que el sistema no mueva una matriz durante la ejecución de un bloque de código en el método PointyMethod(). Observe que fixed sólo se utiliza dentro de código no seguro:
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);
}
}
Vea también
Tareas
Conceptos
Referencia
Código no seguro y punteros (Guía de programación de C#)