¿Hace alguna diferencia usar inseguro dentro o fuera de un bucle?


Nunca necesité usar unsafe en el pasado, pero ahora lo necesito para trabajar con un puntero manipulando un mapa de bits.

No pude encontrar ninguna documentación que indique lo contrario, pero me gustaría entender mejor cómo funciona unsafe y si hace alguna diferencia usarlo dentro o fuera de un bucle.

¿Es mejor hacer:

unsafe
{
    for (int x = 0; x < maxX; x++)
    {
        for (int y = 0; y < maxY; y++)
        {           
            //Unsafe pointer operations here.
        }
    }
}

O hacer?:

for (int x = 0; x < maxX; x++)
{
    for (int y = 0; y < maxY; y++)
    {   
        unsafe
        {       
            //Unsafe pointer operations here.
        }
    }
}
 65
Author: Mark Hurd, 2016-01-22

2 answers

unsafe keyword es un marcador que usas para decirle al compilador que sabes lo que estás haciendo. Su propósito principal es similar a documentar su código: unsafe el bloque muestra partes de su código que usted designa como territorio no administrado; no hay impacto en la ejecución real del código.

Con esto en mente, tiene sentido reducir el tamaño de este territorio inseguro tanto como sea posible, lo que significa que su segundo enfoque es mejor que el primero.

Vale la pena mencionar que otras dos alternativas, es decir, marcar el método y marcar la clase con unsafe, también son inferiores al enfoque cuando el bloque inseguro se coloca alrededor de la porción más pequeña posible del código.

 55
Author: dasblinkenlight,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-22 17:27:25

unsafe cambia las expresiones para las que el compilador aceptará y producirá la salida. No impone ninguna sobrecarga de tiempo de ejecución, en sí misma. Para cualquier expresión que no requiera unsafe, el compilador emitirá el mismo código ya sea dentro de un contexto unsafe o no.

Para los detalles de qué expresiones solo se pueden usar dentro de un contexto unsafe, recomiendo consultar la sección 18 de la Especificación del Lenguaje C #

 37
Author: Damien_The_Unbeliever,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-22 17:45:38