Indicizzatori (Guida per programmatori C#)

Gli indicizzatori consentono di indicizzare le istanze di una classe o struct esattamente come le matrici. Il valore indicizzato può essere impostato o recuperato senza specificare in modo esplicito un membro di istanza o tipo. Gli indicizzatori sono analoghi alle proprietà, con la differenza che le relative funzioni di accesso accettano i parametri.

Nell'esempio seguente viene definita una classe generica con i semplici metodi delle funzioni di accesso get e set per assegnare e recuperare i valori. La classe Program crea un'istanza di questa classe per archiviare le stringhe.

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.

Nota

Per altri esempi, vedere Sezioni correlate.

Definizioni del corpo dell'espressione

È normale che un indicizzatore ottenga o imposti una funzione di accesso in modo che sia costituita da una singola istruzione che restituisce o imposta un valore. I membri con corpo di espressione offrono una sintassi semplificata per supportare questo scenario. A partire da C# 6 è possibile implementare un indicizzatore di sola lettura come membro con corpo di espressione, come mostrato nell'esempio seguente.

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.

Si noti che => introduce il corpo dell'espressione e che la parola chiave get non è usata.

A partire da C# 7.0, le funzioni di accesso get e set possono essere implementate entrambe come membri con corpo di espressione. In questo caso, è necessario usare entrambe le parole chiave get e set. Ad esempio:

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.

Panoramica sugli indicizzatori

  • Gli indicizzatori consentono di indicizzare gli oggetti in modo simile alle matrici.

  • Una funzione di accesso get restituisce un valore. Una funzione di accesso set assegna un valore.

  • La parola chiave this viene usata per definire gli indicizzatori.

  • La parola chiave value viene usata per definire il valore che deve essere assegnato dalla funzione di accesso .

  • Non è necessario che gli indicizzatori vengano indicizzati da un valore Integer, perché la definizione del meccanismo di ricerca specifico dipende dall'utente.

  • Gli indicizzatori possono essere sottoposti a overload.

  • Gli indicizzatori possono avere più di un parametro formale, ad esempio quando si accede a una matrice bidimensionale.

Sezioni correlate

Specifiche del linguaggio C#

Per altre informazioni, vedere Indicizzatori nella Specifica del linguaggio C#. La specifica del linguaggio costituisce il riferimento ufficiale principale per la sintassi e l'uso di C#.

Vedi anche