A la hora de definir un indizador
se usa una sintaxis parecida a la de las propiedades:
<tipoIndizador>
this[<índices>]
{
set
{
<códigoEscritura>
}
get
{
<códigoLectura>
}
}
Las únicas diferencias entre esta
sintaxis y la de las propiedades son:
- El nombre dado a un indizador siempre ha de ser this,
pues carece de sentido poder darle cualquiera en tanto que a un indizador
no se accede por su nombre sino aplicando el operador [ ] a
un objeto. Por ello, lo que diferenciará a unos indizadores de otros será
el número y tipo de sus <índices>
- En <índices> se indica cuáles son los
índices que se pueden usar al acceder al indizador. Para ello la sintaxis
usada es casi la misma que la que se usa para especificar los parámetros
de un método, sólo que no se admite la inclusión de modificadores ref,
out
o params
y que siempre ha de definirse al menos un parámetro. Obviamente, el nombre
que se dé a cada índice será el nombre con el que luego se podrá acceder
al mismo en los bloques set/get.
- No se pueden definir indizadores estáticos, sino
sólo indizadores de objetos.
Por todo lo demás, la sintaxis de
definición de los indizadores es la misma que la de las propiedades: pueden ser
de sólo lectura o de sólo escritura, da igual el orden en que se definan sus
bloques set/get,
dentro del bloque set se puede acceder al valor a escribir a través
del parámetro especial value del tipo del indizador, el código del
bloque get
ha de devolver un objeto de dicho tipo, etc.
A continuación se muestra un
ejemplo de definición de una clase que consta de dos indizadores: ambos
permiten almacenar elementos de tipo entero, pero uno toma como índice un
entero y el otro toma dos cadenas:
using System;
public class A
{
public int this[int
índice]
{
set
{
Console.WriteLine(“Escrito
{0} en posición {1}”, value, índice);
}
get
{
Console.WriteLine(“Leído
1 de posición {0}”, índice);
return 1;
}
}
public int this[string
cad1, string cad2]
{
set
{
Console.WriteLine(“Escrito
{0} en posición ({1},{2})”, value, cad1, cad2);
}
get
{
Console.WriteLine(“Leído
prueba de posición ({0},{1})”, cad1, cad2);
return
2;
}
}
}