Индексаторы (Руководство по программированию в C#)Indexers (C# Programming Guide)

Индексаторы позволяют индексировать экземпляры класса или структуры точно так же, как и массивы.Indexers allow instances of a class or struct to be indexed just like arrays. Индексированное значение можно задавать или получать без явного указания типа или экземпляра элемента.The indexed value can be set or retrieved without explicitly specifying a type or instance member. Индексаторы действуют как свойства, за исключением того, что их акцессоры принимают параметры.Indexers resemble properties except that their accessors take parameters.

В следующем примере определяется универсальный класс с простыми акцессорами get и set для назначения и получения значений.The following example defines a generic class with simple get and set accessor methods to assign and retrieve values. Класс Program создает экземпляр этого класса для хранения строк.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.

Примечание

Дополнительные примеры см. в разделе Связанные разделы.For more examples, see Related Sections.

Определения текста выраженийExpression Body Definitions

Довольно часто акцессор get или set индексатора состоит из одной инструкции, которая просто возвращает или задает значение.It is common for an indexer's get or set accessor to consist of a single statement that either returns or sets a value. Члены, воплощающие выражение, предоставляют упрощенный синтаксис для поддержки такого варианта использования.Expression-bodied members provide a simplified syntax to support this scenario. Начиная с версии C# 6, доступные только для чтения индексаторы можно реализовать в виде члена, воплощающего выражение, как показано в следующем примере.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.

Обратите внимание, что => представляет тело выражения, а ключевое слово get не используется.Note that => introduces the expression body, and that the get keyword is not used.

Начиная с версии C# 7.0, методы доступа get и set можно реализовывать в виде членов с телом в виде выражения.Starting with C# 7.0, both the get and set accessor can be an implemented as expression-bodied members. В этом случае необходимо указывать оба ключевых слова (get и set).In this case, both get and set keywords must be used. Например: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.

Общие сведения об индексаторахIndexers Overview

  • Индексаторы позволяют индексировать объекты так же, как и массивы.Indexers enable objects to be indexed in a similar manner to arrays.

  • Метод доступа get возвращает значение.A get accessor returns a value. Метод доступа set назначает значение.A set accessor assigns a value.

  • Ключевое слово this используется для определения индексаторов.The this keyword is used to define the indexer.

  • Ключевое слово valueset используется для определения значения, присваиваемого индексатором .The value keyword is used to define the value being assigned by the set indexer.

  • Индексаторы не нужно индексировать по целому значению; пользователь может определить конкретный механизм поиска на свое усмотрение.Indexers do not have to be indexed by an integer value; it is up to you how to define the specific look-up mechanism.

  • Индексаторы могут быть перегружены.Indexers can be overloaded.

  • Индексаторы могут иметь более одного формального параметра, например при доступе к двумерному массиву.Indexers can have more than one formal parameter, for example, when accessing a two-dimensional array.

Связанные разделыRelated Sections

Спецификация языка C#C# Language Specification

Дополнительные сведения см. в разделе Индексаторы в Спецификации языка C#.For more information, see Indexers in the C# Language Specification. Спецификация языка является предписывающим источником информации о синтаксисе и использовании языка C#.The language specification is the definitive source for C# syntax and usage.

См. такжеSee also