2010-07-03 10 views
12

Quali sono le limitazioni del codice non sicuro, in C#? Ad esempio, posso eseguire cast di puntatori e aritmetici virtualmente arbitrari come se stessi usando C o C++?Codice non sicuro in C#

risposta

11

Sì. All bets are off quando è in pericolo la sicurezza.

Questa è l'idea alla base di "non sicuro" - che la "sicurezza" dei tipi verificabili viene rimosso, e si può lanciare da un puntatore di un tipo a un puntatore di un altro tipo, senza il runtime tenervi da shooting yourself in the foot, se così desidero - molto simile a C o C++.

Ecco un esempio di utilizzo di diversi tipi di puntatore in 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]; 
    } 
} 

Annotare il tipo di matrice è Byte[], ma dopo ho un Byte* posso gettarlo ai Int64* e lavorare con 8 byte alla tempo.

+0

+1 Per il collegamento (e una buona risposta). – Sam

1

Sì, puoi creare un punto del puntatore ovunque desideri.

Tuttavia, poiché il programma è in esecuzione in uno spazio di indirizzi virtuali, è possibile accedere solo alla memoria effettivamente esistente in quello spazio, ovvero non è possibile accedere ad altri processi e non è possibile accedere alla memoria che non ha è stato assegnato.

0

È possibile consultare la pagina seguente per ulteriori informazioni:

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

codice unsafe offre la possibilità di dichiarare puntatori per qualsiasi variabile primitiva (tipi fondamentali); puoi lanciare tra i tipi di puntatore. L'aritmetica del puntatore si basa sulla dimensione di memorizzazione del tipo di puntatore, pertanto l'applicazione post-incremento o post-decremento su un puntatore aumenterà l'indirizzo in base al sizeof (tipo).

3

Sì, è tutto possibile. Ecco lo Unsafe Code Tutorial da MSDN.

A tutti quelli che dicono che usare questa è un'idea orribile: sì, ma è lì per un motivo. Ho dovuto utilizzare questo (per la prima volta) solo di recente, ottenendo i dati della webcam tramite un'API di terze parti che ha restituito Byte *.

Problemi correlati