Indexantes (Guia de Programação C#)
Os indexantes permitem que os casos de uma classe ou estrutura sejam indexados tal como as matrizes. O valor indexado pode ser definido ou recuperado sem especificar explicitamente um tipo ou membro de instância. Os indexantes assemelham-se a propriedades , exceto que os seus acessórios têm parâmetros.
O exemplo a seguir define uma classe genérica com métodos acessórios simples get e set para atribuir e recuperar valores. A Program
classe cria um exemplo desta classe para armazenar cordas.
using System;
class SampleCollection<T>
{
// Declare an array to store the data elements.
private T[] arr = new T[100];
// Define the indexer to allow client code to use [] notation.
public T this[int i]
{
get { return arr[i]; }
set { arr[i] = value; }
}
}
class Program
{
static void Main()
{
var stringCollection = new SampleCollection<string>();
stringCollection[0] = "Hello, World";
Console.WriteLine(stringCollection[0]);
}
}
// The example displays the following output:
// Hello, World.
Nota
Para mais exemplos, consulte Secções Relacionadas.
Definições do corpo de expressão
É comum que um indexante obtenha ou conjunto acessório consista numa única declaração que retorne ou define um valor. Os membros encorpados de expressão fornecem uma sintaxe simplificada para apoiar este cenário. Começando por C# 6, um indexante só de leitura pode ser implementado como um membro encorpado pela expressão, como mostra o exemplo a seguir.
using System;
class SampleCollection<T>
{
// Declare an array to store the data elements.
private T[] arr = new T[100];
int nextIndex = 0;
// Define the indexer to allow client code to use [] notation.
public T this[int i] => arr[i];
public void Add(T value)
{
if (nextIndex >= arr.Length)
throw new IndexOutOfRangeException($"The collection can hold only {arr.Length} elements.");
arr[nextIndex++] = value;
}
}
class Program
{
static void Main()
{
var stringCollection = new SampleCollection<string>();
stringCollection.Add("Hello, World");
System.Console.WriteLine(stringCollection[0]);
}
}
// The example displays the following output:
// Hello, World.
Note que =>
introduz o corpo da expressão e que a get
palavra-chave não é usada.
Começando por C# 7.0, tanto o acessório get como o conjunto podem ser implementados como membros com expressões. Neste caso, devem ser utilizadas palavras-chave get
e set
palavras-chave. Por exemplo:
using System;
class SampleCollection<T>
{
// Declare an array to store the data elements.
private T[] arr = new T[100];
// Define the indexer to allow client code to use [] notation.
public T this[int i]
{
get => arr[i];
set => arr[i] = value;
}
}
class Program
{
static void Main()
{
var stringCollection = new SampleCollection<string>();
stringCollection[0] = "Hello, World.";
Console.WriteLine(stringCollection[0]);
}
}
// The example displays the following output:
// Hello, World.
Visão geral dos indexantes
Os indexantes permitem que os objetos sejam indexados de forma semelhante às matrizes.
Um
get
acessório devolve um valor. Umset
acessório atribui um valor.A palavra-chave é usada para definir o indexante.
A palavra-chave de valor é utilizada para definir o valor atribuído pelo
set
acessório.Os indexantes não têm de ser indexados por um valor inteiro; cabe-lhe a si definir o mecanismo específico de procuração.
Os indexantes podem estar sobrecarregados.
Os indexantes podem ter mais de um parâmetro formal, por exemplo, ao aceder a uma matriz bidimensional.
Secções Relacionadas
Especificação linguística C#
Para obter mais informações, consulte Indexantes na Especificação de Idioma C. A especificação linguística é a fonte definitiva para a sintaxe e utilização C#.