Indexeerfuncties (C#-programmeerhandleiding)
Met indexeerfuncties kunnen exemplaren van een klasse of struct net als matrices worden geïndexeerd. De geïndexeerde waarde kan worden ingesteld of opgehaald zonder expliciet een type of exemplaarlid op te geven. Indexeerfuncties lijken op eigenschappen , behalve dat hun accessors parameters gebruiken.
In het volgende voorbeeld wordt een algemene klasse gedefinieerd met eenvoudige get - en set accessor-methoden om waarden toe te wijzen en op te halen. De Program
klasse maakt een exemplaar van deze klasse voor het opslaan van tekenreeksen.
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.
Notitie
Zie Verwante secties voor meer voorbeelden.
Hoofdtekstdefinities van expressies
Het is gebruikelijk dat de accessor van een indexeerfunctie bestaat uit één instructie die een waarde retourneert of instelt. Expressie-bodied leden bieden een vereenvoudigde syntaxis ter ondersteuning van dit scenario. Vanaf C# 6 kan een alleen-lezen indexeerfunctie worden geïmplementeerd als een expressielid, zoals in het volgende voorbeeld wordt weergegeven.
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.
Houd er rekening mee dat =>
de hoofdtekst van de expressie wordt geïntroduceerd en dat het get
trefwoord niet wordt gebruikt.
Vanaf C# 7.0 kan zowel de get- als set-accessor een implementatie zijn als expressie-bodied leden. In dit geval moeten zowel get
set
als trefwoorden worden gebruikt. Bijvoorbeeld:
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.
Overzicht van indexeerfuncties
Met indexeerfuncties kunnen objecten op een vergelijkbare manier worden geïndexeerd als matrices.
Een
get
accessor retourneert een waarde. Eenset
accessor wijst een waarde toe.Het trefwoord wordt gebruikt om de indexeerfunctie te definiëren.
Het trefwoord waarde wordt gebruikt om de waarde te definiëren die wordt toegewezen door de
set
accessor.Indexeerfuncties hoeven niet te worden geïndexeerd door een geheel getal; het is aan u hoe u het specifieke opzoekmechanisme definieert.
Indexeerfuncties kunnen worden overbelast.
Indexeerfuncties kunnen bijvoorbeeld meer dan één formele parameter hebben bij het openen van een tweedimensionale matrix.
Gerelateerde secties
C#-taalspecificatie
Zie Indexeerfuncties in de C#-taalspecificatie voor meer informatie. De taalspecificatie is de definitieve bron voor de C#-syntaxis en het gebruik.