C # - Indexadores
A indexerpermite que um objeto seja indexado como uma matriz. Quando você define um indexador para uma classe, esta classe se comporta de forma semelhante a umvirtual array. Você pode então acessar a instância dessa classe usando o operador de acesso à matriz ([]).
Sintaxe
Um indexador unidimensional tem a seguinte sintaxe -
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 de indexadores
A declaração de comportamento de um indexador é até certo ponto semelhante a uma propriedade. semelhantes às propriedades, você usa get e setacessadores para definir um indexador. No entanto, as propriedades retornam ou definem um membro de dados específico, enquanto os indexadores retornam ou definem um valor específico da instância do objeto. Em outras palavras, ele divide os dados da instância em partes menores e indexa cada parte, obtém ou define cada parte.
Definir uma propriedade envolve fornecer um nome de propriedade. Indexadores não são definidos com nomes, mas com othispalavra-chave, que se refere à instância do objeto. O exemplo a seguir demonstra o conceito -
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 o código acima é compilado e executado, ele produz o seguinte resultado -
Zara
Riz
Nuha
Asif
Davinder
Sunil
Rubic
N. A.
N. A.
N. A.
Indexadores sobrecarregados
Os indexadores podem estar sobrecarregados. Os indexadores também podem ser declarados com vários parâmetros e cada parâmetro pode ser um tipo diferente. Não é necessário que os índices sejam inteiros. C # permite que os índices sejam de outros tipos, por exemplo, uma string.
O exemplo a seguir demonstra indexadores sobrecarregados -
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 o código acima é compilado e executado, ele produz o seguinte resultado -
Zara
Riz
Nuha
Asif
Davinder
Sunil
Rubic
N. A.
N. A.
N. A.
2