2015-09-03 7 views
8

La riga fixed (int* pArray = &array[0]) dell'esempio riportato di seguito pin l'intero array o solo array[0]?Come bloccare l'intero array in C# utilizzando la parola chiave fixed

int array = new int[10]; 
unsafe { 
    fixed (int* pArray = &array[0]) { } // or just 'array' 
} 
+0

penso no. devi fare 'fixed (int * pArray = array)' –

+0

@M.kazemAkhgary, no, non funzionerà: 'CS0208 Impossibile prendere l'indirizzo di, ottenere la dimensione di o dichiarare un puntatore a un tipo gestito ('int []')' –

+2

@ThomasLevesque non mettere '&' before' array '. scrivi '(int * pArray = array)' –

risposta

6

La seguente dichiarazione:

fixed (int* pArray = array) 

risolverà il completo allineamento. La prova può essere trovato nel C# language specification (Sezione 18.6 La dichiarazione fissa, sottolineatura mia):

A -pointer-inizializzatore fisso può essere uno dei seguenti:

...

  • Un'espressione di un tipo di matrice con elementi di un tipo non gestito T, a condizione che il tipo T * sia implicitamente convertibile al tipo di puntatore indicato nell'istruzione fissa. In questo caso, l'inizializzatore calcola l'indirizzo del primo elemento nell'array e l'intero array è garantito per rimanere in un indirizzo fisso per la durata dell'istruzione fissa. ...

La seguente dichiarazione:

fixed (int* pArray = &array[0]) 

correzioni l'indirizzo del primo elemento dell'array. Ancora una volta, una citazione dalla specifica (da una lista trovato in quel capitolo):

...  
[third fixed statement:] fixed (int* p = &a[0]) F(p); 
... 

... e terza comunicazione correzioni e ottiene l'indirizzo di un elemento di matrice.


Nota a margine: Parto dal presupposto che qualsiasi applicazione sano di mente che fissa l'elemento prima risolve semplicemente l'intero array, ma la specifica non sembra garantirla.

Scavando un po 'più in profondità nel codice di esempio nella specifica rivela la seguente:

...  
[third fixed statement:] fixed (int* p = &a[0]) F(p); 
[fourth fixed statement:] fixed (int* p = a) F(p); 
... 

La quarta istruzione fixed nell'esempio precedente produce un risultato simile alla terza.

Purtroppo, non specificano esattamente cosa si intende per "risultato simile", ma vale la pena notare che non hanno detto "stesso risultato".