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 accessoset
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#.