Qual è la differenza tra i seguenti due metodi di creazione di un array in C #:
-
int[] arr = new int[] { 1, 2, 3 };
-
Array arr = new int[] { 1, 2, 3 };
Il primo modulo crea una matrice di numeri interi. Il secondo modulo crea una matrice di qualcosa .
La principale differenza è che la prima variante offre allo sviluppatore l'indicazione esplicita del tipo di oggetti memorizzati nella raccolta. Questa indicazione aiuterà sia al momento della scrittura del codice se si utilizza un IDE con IntelliSense, sia nel momento in cui il codice è compilato. Ad esempio, non sarà possibile aggiungere una stringa a una sequenza se contiene numeri interi. Il seguente codice non verrà compilato:
var arr = new [] { 1, 2, 3 };
arr[1] = "Hello World"; // CS0029 Cannot implicitly convert type 'string' to 'int'
D'altra parte, con Array
, non puoi utilizzare gli indici per modificare i valori degli elementi:
Array a = new [] { 1, 2, 3 };
a[1] = "Hello World";
// CS0021 Cannot apply indexing with [] to an expression of type 'Array'
che ti obbliga a impostare il valore in questo modo:
Array arr = new [] { 1, 2, 3 };
arr.SetValue("Hello World", 1);
Questo codice verrà effettivamente compilato, ma non riesce durante il runtime con un InvalidCastException
.
Quindi, a meno che non sia effettivamente necessario sopprimere l'indicazione del tipo (e non riesco a immaginare un caso in cui ne avresti bisogno), usa semplicemente:
var arr = new [] { 1, 2, 3 };
e lascia che IDE e IntelliSense ti aiutino a far rispettare i tipi.
Tieni presente che un array di qualcosa non è la stessa cosa di un array di object
s. Per capire la differenza, prova a eseguire il seguente elemento di codice:
var arr = new object[] { 1, 2, 3 };
arr.SetValue("Hello, World!", 1);
Vedi? Nessuna eccezione di runtime! Questo perché, questa volta, abbiamo un array tipizzato, ovvero un array contenente le istanze di una classe che eredita da object
, in altre parole qualsiasi classe in C #. D'altra parte, ciò che Array
ti dice è che memorizza qualcosa al suo interno, ma non rivelerà (facilmente) il tipo: potrebbe essere object
o int
o string
o altro il resto.