Indexer (C#-Programmierhandbuch)

Indexer ermöglichen, dass Instanzen einer Klasse oder Struktur wie Arrays indiziert werden. Der indizierte Wert kann festgelegt oder ohne explizite Angabe eines Typs oder Instanzmembers abgerufen werden. Indexer ähneln Eigenschaften. Der Unterschied besteht jedoch darin, dass ihre Zugriffsmethoden Parameter verwenden.

Im folgenden Beispiel wird eine generische Klasse mit einfachen get- und set-Accessormethoden zum Zuweisen und Abrufen von Werten definiert. Die Program-Klasse erstellt eine Instanz dieser Klasse für das Speichern von Zeichenfolgen.

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.
Hinweis

Weitere Beispiele finden Sie unter Verwandte Abschnitte.

Ausdruckstextdefinitionen

Get- oder Set-Accessoren eines Indexers bestehen häufig aus einer einzelnen Anweisung, die einen Wert zurückgibt oder festlegt. Ausdruckskörpermember bieten eine vereinfachte Syntax zur Unterstützung dieses Szenarios. Ab C# 6 kann ein schreibgeschützter Indexer als Ausdruckskörpermember implementiert werden, wie im folgenden Beispiel gezeigt.

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.

Beachten Sie, dass => den Ausdruckstext vorstellt und dass das get-Schlüsselwort nicht verwendet wird.

Ab C# 7 können der Get- und der Set-Accessor als Ausdruckskörpermember implementiert werden. In diesem Fall müssen die Schlüsselwörter get und set verwendet werden. Zum Beispiel:

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.

Übersicht über Indexer

  • Indexer ermöglichen es Objekten, in ähnlicher Weise wie Arrays indiziert zu werden.

  • Ein get-Accessor gibt einen Wert zurück. Ein set-Accessor weist einen Wert zu.

  • Das this-Schlüsselwort wird zum Definieren des Indexers verwendet.

  • Das value-Schlüsselwort wird verwendet, um den Wert zu definieren, der vom set-Indexer zugewiesen wird.

  • Indexer müssen nicht durch einen Ganzzahlwert indiziert werden. Sie können entscheiden, wie Sie den spezifischen Suchmechanismus definieren möchten.

  • Indexer können überladen werden.

  • Indexer können mehr als einen formalen Parameter aufweisen, beispielsweise beim Zugreifen auf ein 2D-Array.

Verwandte Abschnitte

C#-Programmiersprachenspezifikation

For more information, see the C# Language Specification. The language specification is the definitive source for C# syntax and usage.

Siehe auch

C#-Programmierhandbuch
Eigenschaften