Una collezione si dice read-only se, dopo averla creata, non è più possibile aggiungere, rimuovere o modificarne gli elementi. Il .NET Framework offre molti tipi di collezioni, e questo tip si concentra sulla NameValueCollection che si trova nel namespace System.Collections.Specialized. Si tratta di una collezione di coppie chiave-valore in cui:
- sia la chiave, sia il valore, sono di tipo string;
- i valori sono accessibili sia per indice sia per chiave;
- ad una stessa chiave possono essere associati più valori;
- la collezione è ordinata, cioè conserva l'ordine in cui gli elementi vengono inseriti (questa caratteristica infatti non è scontata, per esempio la Hashtable non lo fa).
Inoltre, è possibile clonare un'istanza di NameValueCollection passando nel costruttore un riferimento all'istanza originale.
Ebbene, per ottenere una versione read-only della NameValueCollection bisogna sfruttare la proprietà IsReadOnly la quale, essendo definita come protected, è accessibile solo dalle classi derivate. Così, per ottenere una versione read-only della NameValueCollection è sufficiente fare due cose:
1) definire una classe ReadOnlyNameValueCollection che deriva da NameValueCollection e imposta IsReadOnly a true.
2) ricevere nel costruttore della classe derivata il riferimento alla collezione originale, e passarlo al costruttore della classe base.
using System.Collections.Specialized;
public class ReadOnlyNameValueCollection : NameValueCollection
{
public ReadOnlyNameValueCollection(NameValueCollection col) : base(col)
{
this.IsReadOnly = true;
}
}
Osservazione: ciò che si ottiene è un clone vero e proprio della collezione originale, non un wrapper che semplicemente ne impedisce la modifica; pertanto, dopo aver ottenuto la copia read-only della collezione, le eventuali modifiche apportate alla collezione originale non avranno effetto sulla copia.