Logo UGIdotNET

Definire una collezione NameValueCollection read-only

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.

Autore: Federico Zanin
Data: 13 maggio 2004
Ultimo aggiornamento: 23 luglio 2004
Categorie: 

© 2001 User Group Italiano UGIdotNET. Tutti i diritti riservati. Note legali. - Partita IVA 01927050185