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é set pří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.

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

Viz také