Indexery (Průvodce programováním v C#)
Indexery umožňují, aby byly instance třídy nebo struktury indexovány stejně jako pole. Indexovaná hodnota může být nastavena nebo načtena bez explicitního určení typu nebo členu instance. Indexery připomínají vlastnosti s tím rozdílem, že jejich přístupové objekty přijímají parametry.
Následující příklad definuje obecnou třídu pomocí jednoduchých přístupových metod Get a set pro přiřazení a načtení hodnot. ProgramTřída 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řistupující objekt get nebo set indexeru se skládá z jednoho příkazu, který vrátí nebo nastaví hodnotu. Členové Expression-těle poskytují zjednodušenou syntaxi pro podporu tohoto scénáře. Počínaje jazykem C# 6 může být indexer jen pro čtení implementován jako člen výrazu těle, 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í tělo výrazu a že get klíčové slovo se nepoužívá.
Počínaje jazykem C# 7,0, přístupový objekt get a set může být implementován jako členové Expression-těle. V takovém případě get set je nutné použít jak klíčová slova, tak i klíčová slova. 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 povolují, aby objekty byly indexovány podobným způsobem jako pole.
getPřistupující objekt vrací hodnotu.setPřístupový objekt přiřadí hodnotu.Klíčové slovo This slouží k definování indexeru.
Klíčové slovo Value slouží k definování hodnoty přidělené
setpřístupovým objektem.Indexery nemusí být indexovány pomocí celočíselné hodnoty; je zde postup, jak definovat konkrétní vyhledávací mechanismus.
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ému poli.
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#.