2013-05-10 22 views
9

Qual è il tipo di indice di un array in C#?Tipo di indice di matrice in C#?

Ad esempio, nel seguente codice, l'indice verrà castato in un int prima dell'accesso all'elemento di matrice (terza riga)?

T[] myArray = new T[255]; 
byte index = 2; 
T element = myArray[index]; 

caso contrario, è più veloce per accedere a un elemento di matrice utilizzando un indice di tipo 'byte' di un indice di tipo 'int'?

Grazie

+0

Sono stupito che questa domanda non sia stata chiesta prima per C#. Per completezza, potrebbe essere interessante menzionare le sue controparti in C++ (http://stackoverflow.com/q/8111357/96780) e "C99" (http://stackoverflow.com/questions/3174850/type-for- array-index-in-C99). –

risposta

8

risposta originale:

Sì, è sempre un int per un'espressione di accesso agli array. Altri indicizzatori (ad esempio in Dictionary<,>) possono avere altri tipi di parametri, ma un indice di accesso alla matrice è sempre int, tramite la promozione, se necessario (come nell'esempio).

Ma aspetta!

In realtà, guardando la sezione 7.6.6.1 delle specifiche C# 5, io non sono così sicuro:

Per un accesso agli array, il primario-no-array-creazione-espressione dell'elemento -accesso deve essere un valore di un tipo di matrice. Inoltre, l'elenco di argomenti di un accesso di array non può contenere argomenti con nome. Il numero di espressioni nell'elenco di argomenti deve essere uguale al grado del tipo di matrice e ciascuna espressione deve essere di tipo, uint , long, ulong o deve essere implicitamente convertibile in uno o più di questi tipi. Il risultato della valutazione di un accesso dell'array è una variabile del tipo di elemento dell'array, ovvero l'elemento dell'array selezionato dal/i valore/i dell'espressione/delle espressioni nella lista-argomenti.

L'elaborazione in fase di esecuzione di un accesso di matrice del modulo P [A], in cui P è un'espressione-no-matrice-creazione-principale di un tipo-array e A è un elenco-argomenti, costituito dal seguenti passi:

  • P viene valutato. Se questa valutazione causa un'eccezione, non vengono eseguiti ulteriori passaggi.

  • Le espressioni di indice dell'elenco di argomenti vengono valutate nell'ordine, da sinistra a destra. Dopo la valutazione di ciascuna espressione dell'indice, viene eseguita una conversione implicita (§6.1) a uno dei seguenti tipi: int, uint, long, ulong. Viene scelto il primo tipo in questo elenco per il quale esiste una conversione implicita. Ad esempio, se l'espressione dell'indice è di tipo short, viene eseguita una conversione implicita a int, dal momento che sono possibili conversioni implicite da short aa long e da short a long. Se la valutazione di un'espressione di indice o la successiva conversione implicita provoca un'eccezione, non vengono valutate ulteriori espressioni di indice e non vengono eseguiti ulteriori passaggi.

E in effetti questo codice funziona:

string[] array = new string[10]; 
long index = 10; 
string element = array[index]; 

Così, mentre nel tuo caso particolare il byte sarebbe stato promosso a int, l'accesso indice di accesso non è sempre attraverso un int.

Anche con il supporto "grandi array" in .NET 4.5, non mi pensare che è possibile creare un array con più di int.MaxValue elementi, ma potrei sbagliarmi. (Non ho il tempo di testarlo adesso, temo.)

+0

In .NET 4.0, valori superiori a int.MaxValue non riescono. –

Problemi correlati