Indexery (Průvodce programováním v C#)
Indexery umožňují indexování instancí třídy nebo struktury stejně jako pole. Indexovaná hodnota se může nastavit nebo načíst bez explicitního zadání typu nebo člena instance. Indexery se podobají vlastnostem s tím rozdílem, že jejich přístupové objekty převezměte parametry.
Následující příklad definuje obecnou třídu s jednoduchými metodami přístupového objektu get a set pro přiřazení a načtení hodnot. Třída Program
vytvoří instanci této třídy pro ukládání řetězců.
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.
Poznámka
Další příklady najdete v části Související oddíly.
Definice textu výrazu
Je běžné, že přístupový objekt get nebo set indexeru se skládá z jediného příkazu, který vrátí nebo nastaví hodnotu. Členové s výrazy poskytují zjednodušenou syntaxi pro podporu tohoto scénáře. Počínaje jazykem C# 6 je možné indexer jen pro čtení implementovat jako člen expression-bodied, jak ukazuje následující příklad.
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.
Všimněte si =>
, že zavádí text výrazu a že klíčové get
slovo není použito.
Počínaje jazykem C# 7.0 může být přístupový objekt get i set implementovaný jako členy s výrazem. V tomto případě je nutné použít get
klíčová set
slova i . Například:
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.
Přehled indexerů
Indexery umožňují indexování objektů podobným způsobem jako pole.
Přistupovací
get
objekt vrátí hodnotu. Přístupovýset
objekt přiřadí hodnotu.Toto klíčové slovo slouží k definování indexeru.
Klíčové slovo value slouží k definování hodnoty, kterou přiřazuje přistupující objekt.
Indexery nemusí být indexovány celočíselnou hodnotou. Je na vás, jak definovat konkrétní mechanismus vyhledávání.
Indexery mohou být přetíženy.
Indexery mohou mít více než jeden formální parametr, například při přístupu k dvojrozměrným polím.
Související oddíly
Specifikace jazyka C#
Další informace najdete v tématu Indexery ve specifikaci jazyka C#. Specifikace jazyka je úplným a rozhodujícím zdrojem pro syntaxi a použití jazyka C#.