Partilhar via


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. Um set 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#.

Ver também