2016-01-22 5 views
65

In passato non avevo mai avuto bisogno di usare la sicurezza, ma ora ho bisogno che funzioni con un puntatore che manipola una bitmap.Fa qualcosa di diverso usare non sicuro all'interno o all'esterno di un loop?

Non sono riuscito a trovare alcuna documentazione che indichi diversamente, ma vorrei capire meglio come funziona in modo non sicuro e se fa alcuna differenza per usarlo all'interno o all'esterno di un ciclo.

è meglio fare:

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

O fare ?:

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

Penso che sia meglio fare il secondo, considerando che i loop for stessi non devono essere "non sicuri" e si vorrebbe minimizzare l'area "non sicura". A meno che non ci sia una sorta di overhead per chiamarlo in loop. – AustinWBryan

+0

@AustinWBryan - Da quello che ho letto, sembrerebbe che tu abbia ragione ed è quello che stiamo facendo, ma vorrei capire meglio qual è la differenza. – Dzyann

+0

@Dzyann non sembra una domanda facile a cui rispondere .. potrebbe essere necessario attendere pazientemente ..;) Sono interessato a conoscere anche la spiegazione – Ian

risposta

55

unsafe è un indicatore che si utilizza per dire al compilatore che si sa cosa stai facendo. Il suo scopo principale è simile alla documentazione del codice: il blocco unsafe mostra parti del codice che si designa come territorio non gestito; non vi è alcun impatto sull'effettiva esecuzione del codice .

Con questo in mente, ha senso ridurre la dimensione di questo territorio non sicuro il più possibile, il che significa che il secondo approccio è migliore del primo.

Vale la pena ricordare che altre due alternative, vale a dire contrassegnare il metodo e contrassegnare la classe con unsafe, sono anche inferiori all'approccio quando il blocco non sicuro è posizionato attorno alla porzione più piccola possibile del codice.

37

unsafe cambiamenti che le espressioni il compilatore accettare e produrre output per. Non impone nessun sovraccarico di runtime, in sé e per sé. Per qualsiasi espressione che non richiede unsafe, il compilatore emetterà lo stesso codice indipendentemente dal contesto unsafe o meno.

Per le specifiche di che espressioni possono essere utilizzati solo all'interno di un contesto unsafe, io consiglierei di sezione di consulenza 18 della parola chiave C# Language Specification

+4

E per gli inevitabili commenti che dicono che questo non risponde alla domanda: questo è il più vicino possibile a rispondere alla domanda il più possibile, dato che la domanda è fuori tema su StackOverflow. @Dzyann se vuoi un consiglio di design, piuttosto che un semplice consiglio tecnico, prova CodeReview.SE. – Luaan

+1

@Luaan - Grazie per avermelo fatto notare. Non considero questo aspetto come un consiglio di design in quanto ho spogliato il codice sulla questione del nostro progetto attuale. Il mio interesse è stato riferito al modo in cui funziona in modo non sicuro, perché ho cercato in giro e non era chiaro per me. – Dzyann

+9

@Luaan No, * non * risponde alla domanda. La domanda è borderline tra SO e CR? Sì. Significa che non può essere su SO? Io non la penso così, ma se lo fai dovresti votare per chiuderlo come fuori tema. Ma ogni risposta alla domanda deve rispondere alla domanda, e questo no.Dare una mezza risposta non è la risposta appropriata a pensare che una domanda sia fuori tema; votare per migrare è. – KRyan

Problemi correlati