Indexer (C#-Programmierhandbuch)Indexers (C# Programming Guide)

Indexer ermöglichen, dass Instanzen einer Klasse oder Struktur wie Arrays indiziert werden.Indexers allow instances of a class or struct to be indexed just like arrays. Der indizierte Wert kann festgelegt oder ohne explizite Angabe eines Typs oder Instanzmembers abgerufen werden.The indexed value can be set or retrieved without explicitly specifying a type or instance member. Indexer ähneln Eigenschaften. Der Unterschied besteht jedoch darin, dass ihre Zugriffsmethoden Parameter verwenden.Indexers resemble properties except that their accessors take parameters.

Im folgenden Beispiel wird eine generische Klasse mit einfachen get- und set-Accessormethoden zum Zuweisen und Abrufen von Werten definiert.The following example defines a generic class with simple get and set accessor methods to assign and retrieve values. Die Program-Klasse erstellt eine Instanz dieser Klasse für das Speichern von Zeichenfolgen.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.

Hinweis

Weitere Beispiele finden Sie unter Verwandte Abschnitte.For more examples, see Related Sections.

AusdruckstextdefinitionenExpression Body Definitions

Get- oder Set-Accessoren eines Indexers bestehen häufig aus einer einzelnen Anweisung, die einen Wert zurückgibt oder festlegt.It is common for an indexer's get or set accessor to consist of a single statement that either returns or sets a value. Ausdruckskörpermember bieten eine vereinfachte Syntax zur Unterstützung dieses Szenarios.Expression-bodied members provide a simplified syntax to support this scenario. Ab C# 6 kann ein schreibgeschützter Indexer als Ausdruckskörpermember implementiert werden, wie im folgenden Beispiel gezeigt.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.

Beachten Sie, dass => den Ausdruckstext vorstellt und dass das get-Schlüsselwort nicht verwendet wird.Note that => introduces the expression body, and that the get keyword is not used.

Ab C# 7 können der Get- und der Set-Accessor als Ausdruckskörpermember implementiert werden.Starting with C# 7, both the get and set accessor can be an implemented as expression-bodied members. In diesem Fall müssen die Schlüsselwörter get und set verwendet werden.In this case, both get and set keywords must be used. Zum Beispiel: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.

Übersicht über IndexerIndexers Overview

  • Indexer ermöglichen es Objekten, in ähnlicher Weise wie Arrays indiziert zu werden.Indexers enable objects to be indexed in a similar manner to arrays.

  • Ein get-Accessor gibt einen Wert zurück.A get accessor returns a value. Ein set-Accessor weist einen Wert zu.A set accessor assigns a value.

  • Das this-Schlüsselwort wird zum Definieren des Indexers verwendet.The this keyword is used to define the indexer.

  • Das value-Schlüsselwort wird verwendet, um den Wert zu definieren, der vom set-Indexer zugewiesen wird.The value keyword is used to define the value being assigned by the set indexer.

  • Indexer müssen nicht durch einen Ganzzahlwert indiziert werden. Sie können entscheiden, wie Sie den spezifischen Suchmechanismus definieren möchten.Indexers do not have to be indexed by an integer value; it is up to you how to define the specific look-up mechanism.

  • Indexer können überladen werden.Indexers can be overloaded.

  • Indexer können mehr als einen formalen Parameter aufweisen, beispielsweise beim Zugreifen auf ein 2D-Array.Indexers can have more than one formal parameter, for example, when accessing a two-dimensional array.

Verwandte AbschnitteRelated Sections

C#-ProgrammiersprachenspezifikationC# Language Specification

Weitere Informationen erhalten Sie unter C#-Sprachspezifikation. Die Sprachspezifikation ist die verbindliche Quelle für die Syntax und Verwendung von C#.

Siehe auchSee Also

C#-ProgrammierhandbuchC# Programming Guide
EigenschaftenProperties