Indexerare (programmeringsguide för C#)

Indexerare tillåter att instanser av en klass eller struct indexeras precis som matriser. Det indexerade värdet kan anges eller hämtas utan att uttryckligen ange en typ eller instansmedlem. Indexerare liknar egenskaper förutom att deras åtkomstorer tar parametrar.

I följande exempel definieras en allmän klass med enkla get - och set-metoder för att tilldela och hämta värden. Klassen Program skapar en instans av den här klassen för lagring av strängar.

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.

Anteckning

Fler exempel finns i Relaterade avsnitt.

Uttryckstextdefinitioner

Det är vanligt att en indexerares get- eller set-accessor består av en enda instruktion som antingen returnerar eller anger ett värde. Medlemmar i uttryckskroppen ger en förenklad syntax för att stödja det här scenariot. Från och med C# 6 kan en skrivskyddad indexerare implementeras som en uttryckskroppsmedlem, vilket visas i följande exempel.

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.

Observera att => introducerar uttryckstexten och att nyckelordet get inte används.

Från och med C# 7.0 kan både get- och set-åtkomstorn implementeras som uttrycksbaserade medlemmar. I det här fallet måste både get och set nyckelord användas. Ett exempel:

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.

Översikt över indexerare

  • Indexerare gör det möjligt att indexera objekt på ett liknande sätt som matriser.

  • En get accessor returnerar ett värde. En set accessor tilldelar ett värde.

  • Det här nyckelordet används för att definiera indexeraren.

  • Nyckelordet värde används för att definiera värdet som tilldelas av set accessorn.

  • Indexerare behöver inte indexeras med ett heltalsvärde. det är upp till dig hur du definierar den specifika uppslagsmekanismen.

  • Indexerare kan överbelastas.

  • Indexerare kan ha mer än en formell parameter, till exempel vid åtkomst till en tvådimensionell matris.

Närliggande avsnitt

C#-språkspecifikation

Mer information finns i Indexerare i C#-språkspecifikationen. Språkspecifikationen är den slutgiltiga källan för C#-syntax och -användning.

Se även