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

Viz také