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
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 = ¤tImage[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.
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.
È 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).
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 *
.
- 1. Come utilizzare un codice non sicuro in un contesto sicuro?
- 2. Qual è la differenza tra codice non sicuro e codice non gestito in C#?
- 3. Come compilare codice non sicuro in VS2012
- 4. Il seguente codice C è sicuro?
- 5. Come funziona questo codice non sicuro?
- 6. Scrivi codice cacao sicuro
- 7. Correzione di una matrice di array in C# (codice non sicuro)
- 8. firma di codice "sicuro" automatizzata
- 9. Codice python più sicuro in esecuzione
- 10. vuoto * come generico in C, è sicuro?
- 11. perché "f = f ++" non è sicuro in c?
- 12. Durata dei temporari in C++ - è sicuro?
- 13. C# perché sizeof non è sicuro e come ottenere dimensioni di una struttura in modo sicuro?
- 14. Qual è la differenza in Swift tra "non proprietario (sicuro)" e "non proprietario (non sicuro)"?
- 15. collegamento non sicuro in angolare
- 16. Incremento sicuro del thread in C#
- 17. Questo è [0] sicuro in C++?
- 18. Quali sono le implicazioni dell'uso di codice non sicuro
- 19. È sicuro restituire una struct in C o C++?
- 20. Conversione di codice R in codice C
- 21. Questo thread di codice grafica è sicuro?
- 22. C'è qualche differenza tra null e 0 quando si assegnano a puntatori in codice non sicuro?
- 23. Questo codice è un thread sicuro?
- 24. Perché eval non è sicuro in javascript?
- 25. C# contatore veloce sicuro (est)
- 26. C'è un puntatore in C# come C++? È sicuro?
- 27. Il mio tipo di codice è sicuro?
- 28. posto sicuro dove salvare il codice
- 29. Unserializzazione maresciallo - non sicuro
- 30. Perché MSVC++ considera "std :: strcat" non "sicuro"? (C++)
+1 Per il collegamento (e una buona risposta). – Sam