Il linguaggio C# permette di creare delle proprietΓ di una classe particolari, queste vengono chiamate proprietΓ indexed default. Lβidea Γ¨ poter fare una cosa del genere:
Test t = new Test();
string value = t[1];
// value assume un valore in base a quanto Γ¨ stato definito nella classe Test
Come si vede dallβesempio indicato sopra, voglio poter accedere ad una classe come se fosse una specie di array, anche se ovviamente questo non Γ¨.
Spesso questo comportamento viene implementato quando la classe interna ha effettivamente una List
o un Dictionary
come proprietΓ e creo questo modo comodo per potervi accedere.
Proseguiamo la spiegazione con un esempio, preso da questo link.
Assumiamo di avere un oggetto Club con al suo interno una List di oggetti Person, ed inoltre ha una default indexer property per poter accedere a tale lista
public class Club
{
/// Collection of Person objects in the Club
private List<Person> people = new List<Person>();
public List<Person> People { get; set; }
/// The Default property of the Club object
public Person this[int index]
{
get { return people[index]; }
set { people[index] = value; }
}
}
public class Person
{
private string _name;
public Person(string name)
{
_name = name;
}
public string Name {get; set;}
}
In questo modo posso correttamente scrivere il seguente codice:
Club club = new Club();
club.People.Add(new Person("Chris"));
// Cambio il nome della prima persona usando il metodo tradizionale
club.People[0].Name = "Joe";
// Cambio il nome della prima persona usando il metodo tradizionale usando la default property
club[0].Name = "John";
Come per ogni altro metodo di una classe, anche queste particolari proprietΓ possono subire un overload, posso quindi avere un accesso tramite indice con un intero e anche con una stringa, la quale potrebbe fare, per esempio, un dictionary lookup.