Indexeurs (Guide de programmation C#)Indexers (C# Programming Guide)

Les indexeurs permettent aux instances d'une classe ou d'un struct d'être indexés comme des tableaux.Indexers allow instances of a class or struct to be indexed just like arrays. La valeur indexée peut être définie ou récupérée sans spécifier explicitement un membre de type ou d’instance.The indexed value can be set or retrieved without explicitly specifying a type or instance member. Les indexeurs s’apparentent aux propriétés à l’exception près que leurs accesseurs acceptent des paramètres.Indexers resemble properties except that their accessors take parameters.

L’exemple suivant définit une classe générique avec des méthodes d’accesseur get et set simples pour attribuer et récupérer des valeurs.The following example defines a generic class with simple get and set accessor methods to assign and retrieve values. La classe Program classe crée une instance de cette classe pour le stockage des chaînes.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.

Notes

Pour plus d’exemples, consultez Rubriques connexes.For more examples, see Related Sections.

Définitions de corps d'expressionExpression Body Definitions

Il est courant pour l’accesseur get ou set d’un indexeur d’être constitué d’une instruction unique qui retourne ou définit une valeur.It is common for an indexer's get or set accessor to consist of a single statement that either returns or sets a value. Les membres expression-bodied fournissent une syntaxe simplifiée pour prendre en charge ce scénario.Expression-bodied members provide a simplified syntax to support this scenario. À partir de C# 6, un indexeur en lecture seule peut être implémenté comme un membre expression-bodied, comme le montre l’exemple suivant.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.

Notez que => introduit le corps de l’expression et que le mot clé get n’est pas utilisé.Note that => introduces the expression body, and that the get keyword is not used.

À partir de C# 7.0, l’accesseur get et l’accesseur set peuvent être implémentés en tant que membres expression-bodied.Starting with C# 7.0, both the get and set accessor can be an implemented as expression-bodied members. Dans ce cas, les deux mots clés get et set doivent être utilisés.In this case, both get and set keywords must be used. Exemple :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.

Vue d'ensemble des indexeursIndexers Overview

  • Les indexeurs permettent aux objets d'être indexés d'une manière similaire aux tableaux.Indexers enable objects to be indexed in a similar manner to arrays.

  • Un accesseur get retourne une valeur.A get accessor returns a value. Un accesseur set affecte une valeur.A set accessor assigns a value.

  • Le mot clé this est utilisé pour définir l’indexeur.The this keyword is used to define the indexer.

  • Le mot clé value est utilisé pour définir la valeur affectée par l’indexeur set.The value keyword is used to define the value being assigned by the set indexer.

  • Les indexeurs n'ont pas besoin d'être indexés par une valeur entière. Il vous appartient de choisir comment définir le mécanisme de recherche spécifique.Indexers do not have to be indexed by an integer value; it is up to you how to define the specific look-up mechanism.

  • Les indexeurs peuvent être surchargés.Indexers can be overloaded.

  • Les indexeurs peuvent avoir plusieurs paramètres formels, par exemple, quand vous accédez à un tableau à deux dimensions.Indexers can have more than one formal parameter, for example, when accessing a two-dimensional array.

Sections connexesRelated Sections

Spécification du langage C#C# Language Specification

Pour plus d’informations, consultez Indexeurs dans la Spécification du langage C#.For more information, see Indexers in the C# Language Specification. La spécification du langage est la source de référence pour la syntaxe C# et son utilisation.The language specification is the definitive source for C# syntax and usage.

Voir aussiSee also