Introduzione agli Array in C#

Con questa lezione iniziamo lo studio di un'importante struttura dati in C#: gli array. Gli array sono una struttura dati fondamentale in programmazione e sono utilizzati per memorizzare una sequenza di elementi omogenei.

In questa lezione impareremo i primi concetti relativi agli array in C#, come la loro dichiarazione, creazione e inizializzazione.

Cos'è un Array?

Gli array sono una struttura dati vitale per qualsiasi linguaggio di programmazione. Un array può essere visto come una sequenza di dati omogenei ossia dello stesso tipo. Tali dati che compongono la sequenza prendono il nome di elementi.

Graficamente possiamo rappresentare un array in questo modo:

Rappresentazione Grafica di un Array
Figura 1: Rappresentazione Grafica di un Array

Ad ogni elemento di un array è associato un indice che ne identifica la posizione all'interno dell'array stesso. In C#, così come in molti linguaggi di programmazione, gli indici degli array partono da zero. Per cui, se abbiamo un array di 5 elementi, ad esempio, gli indici andranno da 0 a 4.

Il numero di elementi di un array è detto dimensione o anche lunghezza dell'array.

Come abbiamo detto, un array è composto di elementi omogenei, ossia dello stesso tipo. Questo significa che un array può contenere solo elementi dello stesso tipo, non importa se il tipo è primitivo o di riferimento. Ciò ci consente di rappresentare un gruppo di elementi simili come una sequenza ordinata e di lavorare su di essi trattandoli come un'unica entità.

Un array può avere più di una dimensione, ma i più adoperati in programmazione sono gli array monodimensionali, ossia a dimensione singola, e gli array bidimensionali, ossia a due dimensioni. Nel primo caso, si parla spesso di vettori per indicare array monodimensionali. Nel secondo caso, invece, si parla di matrici.

Definizione

Array

Un'Array è una struttura dati che rappresenta una sequenza di elementi omogenei. Gli elementi di un array sono indicizzati a partire da zero e sono accessibili tramite un indice.

Dichiarazione di un Array

In C# gli array hanno una lunghezza fissa, che viene stabilita nel momento in cui vengono instanziai. Tale dimensione ne determina il numero totale di elementi. Una volta che questa dimensione è stata stabilita, non può essere modificata durante l'esecuzione del programma.

Per dichiarare un array in C#, dobbiamo adoperare la seguente sintassi:

int[] mioArray;

In questo esempio, la variabile mioArray è il nome dell'array che è composto da elementi di tipo int. Tuttavia, in questo momento, l'array non contiene alcun elemento. L'aggiunta delle parentesi quadre a destra del tipo indica che non si tratta di un unico intero int, bensì di un array di interi.

Quando dichiariamo una variabile di tipo array, come fatto sopra, stiamo in effeti dichiarando un riferimento che, al momento, non ha un valore: punta a null. Questo perché la memoria per contenere gli elementi dell'array non è stata ancora allocata.

Per comprendere meglio la situazione, basta osservare la figura che segue:

L'array mioArray subito dopo la sua dichiarazione
Figura 2: L'array mioArray subito dopo la sua dichiarazione

Come si può vedere, nello stack di esecuzione del programma abbiamo la variabile mioArray, ma attualmente non punta a nessuna area di memoria nello heap.

Definizione

Dichiarare un Array

In linguaggio C# per dichiarare un array si adopera la seguente sintassi:

tipo[] nomeArray;

Dove tipo è il tipo degli elementi dell'array e nomeArray è il nome dell'array.

Creazione di un Array

Per creare un array in C# dobbiamo adoperare l'operatore new il cui scopo è proprio quello di allocare memoria.

Tornando all'esempio di sopra, per creare un array di 5 elementi di tipo int, dobbiamo scrivere:

int[] mioArray = new int[5];

Così facendo, nell'area di memoria dinamica, ossia lo heap, verrà allocato spazio per 5 interi. La variabile mioArray punterà a tale area di memoria. Tutti gli elementi verranno inizializzati a zero. Per cui, la situazione diventerà la seguente:

L'array mioArray subito dopo la creazione con l'operatore new
Figura 3: L'array mioArray subito dopo la creazione con l'operatore new

Come si può vedere, dopo aver allocato la memoria per contenere 5 int, la variabile mioArray punta a tale area di memoria. In C# gli elementi di un array sono sempre memorizzati nella memoria dinamica o Heap.

Il numero totale di elementi viene specificato, in fase di creazione, inserendo il numero tra le parentesi quadre. Tale numero, per ovvi motivi, non deve essere negativo. Una volta fissato, tale numero non può essere modificato.

Definizione

Creazione di un Array

Per creare un array in C# si adopera la seguente sintassi:

tipo[] nomeArray = new tipo[dimensione];

Dove tipo è il tipo degli elementi dell'array, nomeArray è il nome dell'array e dimensione è il numero totale di elementi dell'array.

Inizializzazione di un Array e Valori di Default

Prima di poter utilizzare gli elementi di un certo array, dobbiamo inizializzarli.

In molti linguaggi di programmazione, come il linguaggio C, gli elementi di un array non vengono inizializzati, ma è compito del programmatore farlo. In C#, invece, gli elementi di un array vengono inizializzati automaticamente con un valore di default.

Questo valore di default è tipicamente 0 per i tipi numerici, false per i tipi booleani e null per i tipi di riferimento.

Pertanto, nell'esempio di sopra, tutti gli elementi dell'array mioArray saranno inizializzati a zero.

Possiamo, però, specificare esplicitamente i valori con cui inizializzare gli elementi di un array. Per fare ciò, possiamo adoperare la seguente sintassi:

int[] mioArray = { 1, 2, 3, 4, 5 };

In questo caso, l'array mioArray conterrà i valori 1, 2, 3, 4 e 5. Abbiamo inserito i valori iniziali tra parentesi graffe {} separati da virgole. Questo tipo di inizializzazione ha anche il vantaggio che non dobbiamo specificare la lunghezza dell'array in quanto essa viene determinata dal numero di elementi specificati.

La situazione in memoria sarà la seguente:

L'array mioArray subito dopo l'inizializzazione
Figura 4: L'array mioArray subito dopo l'inizializzazione
Definizione

Dichiarazione e Inizializzazione di un Array

In C#, un array può essere inizializzato al momento della dichiarazione. Per farlo, si adopera la seguente sintassi:

tipo[] nomeArray = { valore1, valore2, ..., valoreN };

Dove tipo è il tipo degli elementi dell'array, nomeArray è il nome dell'array e valore1, valore2, ..., valoreN sono i valori con cui inizializzare gli elementi dell'array.

Esempio

Vediamo un esempio di come dichiarare ed inizializzare un array in C#:

string[] mesi = {
    "Gennaio",
    "Febbraio",
    "Marzo",
    "Aprile",
    "Maggio",
    "Giugno",
    "Luglio",
    "Agosto",
    "Settembre",
    "Ottobre",
    "Novembre",
    "Dicembre"
};

In questo caso, abbiamo allocato un array di 12 elementi di tipo string. Il tipo string è un tipo riferimento, per cui gli elementi dell'array saranno inizializzati a null. Tuttavia, abbiamo specificato esplicitamente i valori iniziali, che sono i nomi dei mesi dell'anno. Tali valori saranno allocati nella memoria dinamica.

Per cui, la disposizione in memoria dell'array mesi sarà la seguente:

Disposizione dell'array mesi in memoria
Figura 5: Disposizione dell'array mesi in memoria

Come si può vedere, la variabile array mesi si trova sullo stack del programma. Gli elementi dell'array, invece, sono allocati nello heap. Poichè tali elementi sono di tipo string, essi contengono riferimenti a oggetti di tipo string a loro volta allocati nello heap.

Limiti di un Array

Un dettaglio fondamentale da ricordare sempre quando si lavora in C# è che gli array, di default, sono zero-based, ossia sono indicizzati a partire da 0.

Pertanto il primo elemento avrà indice 0, il secondo avrà indice 1 e così via. L'ultimo elemento avrà indice pari alla lunghezza dell'array meno uno. Per cui, un array di N elementi avrà indici che vanno da 0 a N-1.

Nota

Un altro aspetto importante da considerare è che, una volta che un array è stato creato, la sua dimensione non può essere modificata. Questo significa che non possiamo aggiungere o rimuovere elementi da un array. Se abbiamo bisogno di una struttura dati che possa crescere o diminuire dinamicamente, dobbiamo adoperare altre strutture dati come le liste.

In Sintesi

In questa lezione abbiamo imparato che:

  • Un array è una struttura dati che rappresenta una sequenza di elementi omogenei.
  • Gli elementi di un array sono indicizzati a partire da zero.
  • In C# gli array sono sempre allocati nello heap.
  • Gli array in C# sono zero-based, ossia sono indicizzati a partire da zero.
  • Una volta che un array è stato creato, la sua dimensione non può essere modificata.

Nella prossima lezione, vedremo come accedere agli elementi di un array e come modificarli.