Indeksatory (Przewodnik programowania w języku C#)Indexers (C# Programming Guide)

Indeksatory umożliwiają indeksowanie wystąpień klasy lub struktury tak samo jak w przypadku tablic.Indexers allow instances of a class or struct to be indexed just like arrays. Indeksowaną wartość można ustawić lub pobrać bez jawnego określenia typu lub elementu członkowskiego wystąpienia.The indexed value can be set or retrieved without explicitly specifying a type or instance member. Indeksatory przypominają Właściwości , z tą różnicą, że ich metody dostępu pobierają parametry.Indexers resemble properties except that their accessors take parameters.

W poniższym przykładzie zdefiniowano klasę generyczną z prostymi metodami dostępu Get i Set do przypisywania i pobierania wartości.The following example defines a generic class with simple get and set accessor methods to assign and retrieve values. Klasa Program tworzy wystąpienie tej klasy do przechowywania ciągów.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.

Uwaga

Aby uzyskać więcej przykładów, zobacz sekcję pokrewne.For more examples, see Related Sections.

Definicje treści wyrażeniaExpression Body Definitions

Metoda dostępu "Get" lub "Set" może składać się z pojedynczej instrukcji, która zwraca lub ustawia wartość.It is common for an indexer's get or set accessor to consist of a single statement that either returns or sets a value. Składowe w postaci wyrażeń zawierają uproszczoną składnię do obsługi tego scenariusza.Expression-bodied members provide a simplified syntax to support this scenario. Począwszy od C# 6, indeksator tylko do odczytu może być implementowany jako składowa z wyrażeniem, jak pokazano w poniższym przykładzie.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.

Należy zauważyć, że => wprowadza treść wyrażenia, a słowo kluczowe get nie jest używane.Note that => introduces the expression body, and that the get keyword is not used.

Począwszy od C# 7,0, obie metody dostępu get i Set mogą być zaimplementowane jako elementy członkowskie z wyrażeniami.Starting with C# 7.0, both the get and set accessor can be an implemented as expression-bodied members. W takim przypadku należy użyć słów kluczowych get i set.In this case, both get and set keywords must be used. Na przykład: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.

Omówienie indeksatorówIndexers Overview

  • Indeksatory umożliwiają indeksowanie obiektów w podobny sposób do tablic.Indexers enable objects to be indexed in a similar manner to arrays.

  • Metoda dostępu get zwraca wartość.A get accessor returns a value. Metoda dostępu set przypisuje wartość.A set accessor assigns a value.

  • To słowo kluczowe jest używane do definiowania indeksatora.The this keyword is used to define the indexer.

  • Słowo kluczowe Value służy do definiowania wartości przypisanej przez indeksator set.The value keyword is used to define the value being assigned by the set indexer.

  • Indeksatory nie muszą być indeksowane przez wartość całkowitą; Istnieje możliwość zdefiniowania określonego mechanizmu wyszukiwania.Indexers do not have to be indexed by an integer value; it is up to you how to define the specific look-up mechanism.

  • Indeksatory mogą być przeciążone.Indexers can be overloaded.

  • Indeksatory mogą mieć więcej niż jeden parametr formalny, na przykład podczas uzyskiwania dostępu do tablicy dwuwymiarowej.Indexers can have more than one formal parameter, for example, when accessing a two-dimensional array.

Sekcje pokrewneRelated Sections

Specyfikacja języka C#C# Language Specification

Aby uzyskać więcej informacji, zobacz indeksatory w C# specyfikacji języka.For more information, see Indexers in the C# Language Specification. Specyfikacja języka jest ostatecznym źródłem informacji o składni i użyciu języka C#.The language specification is the definitive source for C# syntax and usage.

Zobacz takżeSee also