Indeksatory (Przewodnik programowania w języku C#)

Indeksatorzy umożliwiają indeksowanie wystąpień klasy lub struktury tak samo jak tablic. Indeksowana wartość może być ustawiana lub pobierana bez jawnego określania typu lub wystąpienia. Indeksatory przypominają właściwości z tą różnicą, że ich obiekty dostępu mają parametry.

W poniższym przykładzie zdefiniowano ogólną klasę z prostymi metodami get i set accessor w celu przypisywania i pobierania wartości. Klasa Program tworzy wystąpienie tej klasy do przechowywania ciągów.

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 Sekcje pokrewne.

Definicje treści wyrażeń

Często metody dostępu get lub set indeksatora składają się z pojedynczej instrukcji, która zwraca lub ustawia wartość. Składowe z wyrażeniem zapewniają uproszczoną składnię do obsługi tego scenariusza. Począwszy od języka C# 6 indeksator tylko do odczytu może być implementowany jako element członkowski z wyrażeniem, jak pokazano w poniższym przykładzie.

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 pamiętać => , że wprowadza treść wyrażenia i że słowo kluczowe get nie jest używane.

Począwszy od języka C# 7.0, zarówno get, jak i set accessor można zaimplementować jako elementy członkowskie z wyrażeniem. W takim przypadku należy użyć zarówno get słowa kluczowego , set jak i . Na przykład:

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ów

  • Indeksery umożliwiają indeksowanie obiektów w sposób podobny do tablic.

  • A get accessor zwraca wartość. A set accessor przypisuje wartość.

  • To słowo kluczowe służy do definiowania indeksatora.

  • Słowo kluczowe value służy do definiowania wartości przypisywanej przez accessor .

  • Indeksatory nie muszą być indeksowane przy użyciu wartości całkowitej; To Od Ciebie należy sposób definiowania określonego mechanizmu wyszukiwania.

  • Indeksatory mogą być przeciążone.

  • Indeksatorzy mogą mieć więcej niż jeden parametr formalny, na przykład podczas uzyskiwania dostępu do tablicy dwuwymiarowej.

Sekcje pokrewne

Specyfikacja języka C#

Aby uzyskać więcej informacji, zobacz Indeksatory w specyfikacji języka C#. Specyfikacja języka jest ostatecznym źródłem informacji o składni i użyciu języka C#.

Zobacz też