L'immutabilità dei tipi è un concetto fondamentale nella programmazione moderna. Consentendo la creazione di oggetti che non possono essere modificati dopo la loro creazione, l'immutabilità offre numerosi vantaggi, come la sicurezza, la facilità di ragionamento e la condivisione di oggetti tra thread. In C#, due parole chiave, ReadOnly e Const, vengono spesso utilizzate per garantire l'immutabilità dei dati. Inoltre, il namespace System.Collections.Immutable fornisce una serie di collezioni immutabili che possono essere utilizzate per creare strutture dati sicure e performanti. In questo articolo, esploreremo l'immutabilità dei tipi in C#, le differenze tra le parole chiave ReadOnly e Const e daremo uno sguardo approfondito al namespace System.Collections.Immutable.
In C#, l'immutabilità può essere garantita utilizzando la parola chiave ReadOnly. Quando un oggetto viene dichiarato come ReadOnly, i suoi membri non possono essere modificati dopo la creazione dell'oggetto stesso. Ciò significa che l'oggetto diventa "read-only" e i tentativi di modificare i suoi membri causeranno un errore a compile-time. L'utilizzo di ReadOnly offre numerosi vantaggi, come la prevenzione degli effetti collaterali indesiderati e l'aumento della sicurezza del codice.
Parola chiave Const:
La parola chiave Const viene utilizzata per dichiarare costanti in C#. A differenza di ReadOnly, le costanti definite con Const sono valori noti a compile-time e non possono essere modificati in alcun momento. Le costanti dichiarate con Const vengono risolte a tempo di compilazione e sostituite con il loro valore letterale in tutto il codice sorgente. Questo offre prestazioni ottimali ma limita la flessibilità delle costanti.
Occhio alle differenze! La parola chiave readonly è diversa dalla parola chiave const. Un campo const può essere inizializzato solo nella dichiarazione del campo. Un campo readonly può essere assegnato più volte nella dichiarazione del campo e in qualsiasi costruttore. I campi readonly possono quindi presentare valori diversi a seconda del costruttore usato. Inoltre, mentre un campo const rappresenta una costante in fase di compilazione, il campo readonly può essere usato per le costanti in fase di esecuzione, come nell'esempio seguente:
public static readonly uint timeStamp = (uint)DateTime.Now.Ticks;
Altro esempio:
public const int NumeroMassimo = 100;
In questo caso, la costante NumeroMassimo viene dichiarata come Const e viene assegnato il valore letterale 100. Una volta dichiarata, il valore di NumeroMassimo non può essere modificato. L'utilizzo di costanti offre un modo efficace per definire valori che devono rimanere costanti durante l'esecuzione del programma.
Consideriamo ora la seguente classe in C#:
public class Persona
{
public string Nome { get; }
public int Età { get; }
public Persona(string nome, int età)
{
Nome = nome;
Età = età;
}
}
In questo caso, la classe Persona è dichiarata come immutabile, sebbene non si faccia uso di readonly o const, non c'è "set" nella dichiarazione della proprietà, il che significa che i suoi membri Nome ed Età non possono essere modificati dopo la creazione dell'oggetto Persona. Questo garantisce che i dati della persona rimangano coerenti nel tempo e previene modifiche accidentali.
System.Collections.Immutable:
Il namespace System.Collections.Immutable, introdotto in .NET Framework 4.5, fornisce una serie di collezioni immutabili che possono essere utilizzate per creare strutture dati efficienti e sicure. Queste collezioni sono progettate per garantire l'integrità dei dati durante le operazioni di modifica, consentendo al contempo l'accesso simultaneo da parte di più thread.
Alcune delle collezioni immutabili fornite dal namespace System.Collections.Immutable includono ImmutableList, ImmutableArray, ImmutableDictionary e ImmutableHashSet. Queste collezioni offrono operazioni di modifica efficienti, come l'aggiunta, la rimozione e la modifica, restituendo sempre una nuova istanza della collezione senza modificare quella originale.
Ad esempio:
Copy code
var lista1 = ImmutableList.Empty;
var lista2 = lista1.Add(1);
var lista3 = lista2.Add(2);
Console.WriteLine(lista1); // Output: []
Console.WriteLine(lista2); // Output: [1]
Console.WriteLine(lista3); // Output: [1, 2]
In questo caso, la classe ImmutableList viene utilizzata per creare una lista immutabile. Ogni operazione di modifica restituisce una nuova istanza della lista, consentendo un'interazione sicura tra thread e previene modifiche indesiderate.
#
csharp #
programmazione #
codice #
net #
netcore