Indeksatory (Przewodnik programowania w języku C#)
Indeksatorzy umożliwiają indeksowanie wystąpień klasy lub struktury tak samo jak tablic. Indeksowana wartość może być ustawiana lub pobierana bez jawnego określania typu lub wystąpienia. Indeksatory przypominają właściwości z tą różnicą, że ich obiekty dostępu mają parametry.
W poniższym przykładzie zdefiniowano ogólną klasę z prostymi metodami get i set accessor w celu przypisywania i pobierania wartości. Klasa Program
tworzy wystąpienie tej klasy do przechowywania ciągów.
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.
Uwaga
Aby uzyskać więcej przykładów, zobacz Sekcje pokrewne.
Definicje treści wyrażeń
Często metody dostępu get lub set indeksatora składają się z pojedynczej instrukcji, która zwraca lub ustawia wartość. Składowe z wyrażeniem zapewniają uproszczoną składnię do obsługi tego scenariusza. Począwszy od języka C# 6 indeksator tylko do odczytu może być implementowany jako element członkowski z wyrażeniem, jak pokazano w poniższym przykładzie.
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.
Należy pamiętać =>
, że wprowadza treść wyrażenia i że słowo kluczowe get
nie jest używane.
Począwszy od języka C# 7.0, zarówno get, jak i set accessor można zaimplementować jako elementy członkowskie z wyrażeniem. W takim przypadku należy użyć zarówno get
słowa kluczowego , set
jak i . Na przykład:
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.
Omówienie indeksatorów
Indeksery umożliwiają indeksowanie obiektów w sposób podobny do tablic.
A
get
accessor zwraca wartość. Aset
accessor przypisuje wartość.To słowo kluczowe służy do definiowania indeksatora.
Słowo kluczowe value służy do definiowania wartości przypisywanej przez accessor .
Indeksatory nie muszą być indeksowane przy użyciu wartości całkowitej; To Od Ciebie należy sposób definiowania określonego mechanizmu wyszukiwania.
Indeksatory mogą być przeciążone.
Indeksatorzy mogą mieć więcej niż jeden parametr formalny, na przykład podczas uzyskiwania dostępu do tablicy dwuwymiarowej.
Sekcje pokrewne
Specyfikacja języka C#
Aby uzyskać więcej informacji, zobacz Indeksatory w specyfikacji języka C#. Specyfikacja języka jest ostatecznym źródłem informacji o składni i użyciu języka C#.