Indizadores (Guía de programación de C#)Indexers (C# Programming Guide)

Los indizadores permiten indizar las instancias de una clase o struct como matrices.Indexers allow instances of a class or struct to be indexed just like arrays. El valor indizado se puede establecer o recuperar sin especificar explícitamente un miembro de tipo o de instancia.The indexed value can be set or retrieved without explicitly specifying a type or instance member. Son similares a propiedades, excepto en que sus descriptores de acceso usan parámetros.Indexers resemble properties except that their accessors take parameters.

En el ejemplo siguiente se define una clase genérica con métodos de descriptor de acceso get y set sencillos para asignar y recuperar valores.The following example defines a generic class with simple get and set accessor methods to assign and retrieve values. La clase Program crea una instancia de esta clase para almacenar cadenas.The Program class creates an instance of this class for storing strings.

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 obtener más ejemplos, vea Secciones relacionadas.For more examples, see Related Sections.

Definiciones de cuerpos de expresiónExpression Body Definitions

Es habitual que un descriptor de acceso get o set de un indizador conste de una única instrucción que devuelve o establece un valor.It is common for an indexer's get or set accessor to consist of a single statement that either returns or sets a value. Los miembros con forma de expresión proporcionan una sintaxis simplificada para admitir este escenario.Expression-bodied members provide a simplified syntax to support this scenario. A partir de C# 6, un indizador de solo lectura puede implementarse como un miembro con forma de expresión, como se muestra en el ejemplo siguiente.Starting with C# 6, a read-only indexer can be implemented as an expression-bodied member, as the following example shows.

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.

Tenga en cuenta que => presenta el cuerpo de la expresión y que la palabra clave get no se utiliza.Note that => introduces the expression body, and that the get keyword is not used.

A partir de C# 7.0, los descriptores de acceso get y set se pueden implementar como miembros con forma de expresión.Starting with C# 7.0, both the get and set accessor can be an implemented as expression-bodied members. En este caso, sí deben utilizarse las palabras clave get y set.In this case, both get and set keywords must be used. Por ejemplo:For example:

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.

Información general sobre los indizadoresIndexers Overview

  • Los indizadores permiten indizar objetos de manera similar a como se hace con las matrices.Indexers enable objects to be indexed in a similar manner to arrays.

  • Un descriptor de acceso get devuelve un valor.A get accessor returns a value. Un descriptor de acceso set asigna un valor.A set accessor assigns a value.

  • La palabra clave this se usa para definir los indizadores.The this keyword is used to define the indexer.

  • La palabra clave value se usa para definir el valor asignado por el indizador set.The value keyword is used to define the value being assigned by the set indexer.

  • Los indizadores no tienen que ser indizados por un valor entero; depende de usted cómo definir el mecanismo de búsqueda concreto.Indexers do not have to be indexed by an integer value; it is up to you how to define the specific look-up mechanism.

  • Los indizadores se pueden sobrecargar.Indexers can be overloaded.

  • Los indizadores pueden tener más de un parámetro formal, por ejemplo, al tener acceso a una matriz bidimensional.Indexers can have more than one formal parameter, for example, when accessing a two-dimensional array.

Secciones relacionadasRelated Sections

Especificación del lenguaje C#C# Language Specification

Para obtener más información, vea la sección Indizadores de Especificación del lenguaje C#.For more information, see Indexers in the C# Language Specification. La especificación del lenguaje es la fuente definitiva de la sintaxis y el uso de C#.The language specification is the definitive source for C# syntax and usage.

Vea tambiénSee also