2010-07-03 17 views
12

¿Cuáles son las limitaciones del código inseguro, en C#? Por ejemplo, ¿puedo hacer moldes de punteros y aritmética casi arbitrariamente como si estuviera usando C o C++?Código no seguro en C#

Respuesta

11

Sí. All bets are off cuando no es seguro está en juego.

Esta es la idea detrás de "inseguro": que se elimina la "seguridad" de los tipos verificables, y puede convertir desde un puntero de un tipo a un puntero de otro tipo sin que el tiempo de ejecución lo mantenga shooting yourself in the foot, si así que deseo, al igual que C o C++.

He aquí un ejemplo del uso de diferentes tipos de puntero en C#:

fixed (Byte* dstBytes = &currentImage[0]) 
{ 
    var dstBuffer = (Int64*)dstBytes; 
    const int blockCount = ImageSizeInBytes/sizeof(Int64); 

    for (var j = 0; j < blockCount; j++) 
    { 
     dstBuffer[j] = srcBuffer[j]; 
    } 
} 

Nota del tipo de la matriz es Byte[], pero después de obtener un Byte* puedo echarlo a Int64* y trabajar con 8 bytes a la hora.

+0

+1 Para el enlace, (y una buena respuesta). – Sam

1

Sí, puede hacer un puntero en cualquier lugar que desee.

Sin embargo, como su programa se ejecuta en un espacio de direcciones virtual, solo puede acceder a la memoria que realmente existe en ese espacio, es decir, no puede acceder a ningún otro proceso y no puede acceder a la memoria que no t sido asignado.

0

Puede consultar la página siguiente para más información:

http://msdn.microsoft.com/en-us/library/y31yhkeb.aspx

código no seguro proporciona la capacidad para declarar punteros para prácticamente cualquier variable primitiva (tipos fundamentales); puedes lanzar entre tipos de puntero. La aritmética del puntero se basa en el tamaño de almacenamiento del tipo de puntero, por lo que la aplicación de post-incremento o post-decremento a un puntero aumentará la dirección por tamaño de (tipo).

3

Sí, eso es todo posible. Aquí está el Unsafe Code Tutorial de MSDN.

Para todos aquellos que dicen que usar esto es una idea horrible: sí, pero está ahí por una razón. Tuve que usar esto (por primera vez) recientemente, obtener datos de la cámara web a través de una API de terceros que devolvió Byte *.

Cuestiones relacionadas