C # - Indicizzatori
Un indexerconsente a un oggetto di essere indicizzato come un array. Quando si definisce un indicizzatore per una classe, questa si comporta in modo simile a un filevirtual array. È quindi possibile accedere all'istanza di questa classe utilizzando l'operatore di accesso all'array ([]).
Sintassi
Un indicizzatore unidimensionale ha la seguente sintassi:
element-type this[int index] {
// The get accessor.
get {
// return the value specified by index
}
// The set accessor.
set {
// set the value specified by index
}
}
Uso di indicizzatori
La dichiarazione di comportamento di un indicizzatore è in una certa misura simile a una proprietà. simile alle proprietà che usi get e setfunzioni di accesso per la definizione di un indicizzatore. Tuttavia, le proprietà restituiscono o impostano un membro dati specifico, mentre gli indicizzatori restituiscono o impostano un valore particolare dall'istanza dell'oggetto. In altre parole, suddivide i dati dell'istanza in parti più piccole e indicizza ciascuna parte, acquisisce o imposta ciascuna parte.
La definizione di una proprietà implica fornire un nome di proprietà. Gli indicizzatori non sono definiti con nomi, ma conthisparola chiave, che fa riferimento all'istanza dell'oggetto. Il seguente esempio dimostra il concetto:
using System;
namespace IndexerApplication {
class IndexedNames {
private string[] namelist = new string[size];
static public int size = 10;
public IndexedNames() {
for (int i = 0; i < size; i++)
namelist[i] = "N. A.";
}
public string this[int index] {
get {
string tmp;
if( index >= 0 && index <= size-1 ) {
tmp = namelist[index];
} else {
tmp = "";
}
return ( tmp );
}
set {
if( index >= 0 && index <= size-1 ) {
namelist[index] = value;
}
}
}
static void Main(string[] args) {
IndexedNames names = new IndexedNames();
names[0] = "Zara";
names[1] = "Riz";
names[2] = "Nuha";
names[3] = "Asif";
names[4] = "Davinder";
names[5] = "Sunil";
names[6] = "Rubic";
for ( int i = 0; i < IndexedNames.size; i++ ) {
Console.WriteLine(names[i]);
}
Console.ReadKey();
}
}
}
Quando il codice precedente viene compilato ed eseguito, produce il seguente risultato:
Zara
Riz
Nuha
Asif
Davinder
Sunil
Rubic
N. A.
N. A.
N. A.
Indicizzatori sovraccarichi
Gli indicizzatori possono essere sovraccaricati. Gli indicizzatori possono anche essere dichiarati con più parametri e ogni parametro può essere di un tipo diverso. Non è necessario che gli indici debbano essere numeri interi. C # consente agli indici di essere di altri tipi, ad esempio una stringa.
L'esempio seguente mostra gli indicizzatori sovraccaricati:
using System;
namespace IndexerApplication {
class IndexedNames {
private string[] namelist = new string[size];
static public int size = 10;
public IndexedNames() {
for (int i = 0; i < size; i++) {
namelist[i] = "N. A.";
}
}
public string this[int index] {
get {
string tmp;
if( index >= 0 && index <= size-1 ) {
tmp = namelist[index];
} else {
tmp = "";
}
return ( tmp );
}
set {
if( index >= 0 && index <= size-1 ) {
namelist[index] = value;
}
}
}
public int this[string name] {
get {
int index = 0;
while(index < size) {
if (namelist[index] == name) {
return index;
}
index++;
}
return index;
}
}
static void Main(string[] args) {
IndexedNames names = new IndexedNames();
names[0] = "Zara";
names[1] = "Riz";
names[2] = "Nuha";
names[3] = "Asif";
names[4] = "Davinder";
names[5] = "Sunil";
names[6] = "Rubic";
//using the first indexer with int parameter
for (int i = 0; i < IndexedNames.size; i++) {
Console.WriteLine(names[i]);
}
//using the second indexer with the string parameter
Console.WriteLine(names["Nuha"]);
Console.ReadKey();
}
}
}
Quando il codice precedente viene compilato ed eseguito, produce il seguente risultato:
Zara
Riz
Nuha
Asif
Davinder
Sunil
Rubic
N. A.
N. A.
N. A.
2