Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Os indexadores podem ser declarados em uma interface. Acessadores de indexadores de interface diferem dos acessadores de indexadores de classe das seguintes maneiras:
- Os acessadores de interface não usam modificadores.
- Um acessador de interface normalmente não tem corpo.
Portanto, a finalidade do acessador é indicar se o indexador é do tipo leitura/gravação, somente leitura ou somente gravação. Você pode fornecer uma implementação para um indexador definido em uma interface, mas isso é raro. Normalmente, os indexadores definem uma API para acessar campos de dados, que não podem ser definidos em uma interface.
Este é um exemplo de um acessador de indexador de interface:
public interface ISomeInterface
{
//...
// Indexer declaration:
string this[int index]
{
get;
set;
}
}
A assinatura de um indexador deve ser diferente das assinaturas de todos os outros indexadores declarados na mesma interface.
Exemplo
O exemplo a seguir mostra como implementar indexadores de interface.
// Indexer on an interface:
public interface IIndexInterface
{
// Indexer declaration:
int this[int index]
{
get;
set;
}
}
// Implementing the interface.
class IndexerClass : IIndexInterface
{
private int[] arr = new int[100];
public int this[int index] // indexer declaration
{
// The arr object will throw IndexOutOfRange exception.
get => arr[index];
set => arr[index] = value;
}
}
IndexerClass test = new IndexerClass();
System.Random rand = System.Random.Shared;
// Call the indexer to initialize its elements.
for (int i = 0; i < 10; i++)
{
test[i] = rand.Next();
}
for (int i = 0; i < 10; i++)
{
System.Console.WriteLine($"Element #{i} = {test[i]}");
}
/* Sample output:
Element #0 = 360877544
Element #1 = 327058047
Element #2 = 1913480832
Element #3 = 1519039937
Element #4 = 601472233
Element #5 = 323352310
Element #6 = 1422639981
Element #7 = 1797892494
Element #8 = 875761049
Element #9 = 393083859
*/
No exemplo anterior, é possível usar a implementação de membro de interface explícita usando o nome totalmente qualificado do membro de interface. Por exemplo
string IIndexInterface.this[int index]
{
}
No entanto, o nome totalmente qualificado só será necessário para evitar ambiguidade quando a classe estiver implementando mais de uma interface com a mesma assinatura do indexador. Por exemplo, se uma classe Employee
estiver implementando dois interfaces, ICitizen
e IEmployee
, e as duas interfaces tiverem a mesma assinatura de indexador, a implementação de membro de interface explícita é necessária. Ou seja, a seguinte declaração de indexador:
string IEmployee.this[int index]
{
}
implementa o indexador na interface IEmployee
, enquanto a seguinte declaração:
string ICitizen.this[int index]
{
}
implementa o indexador na interface ICitizen
.