Indexer in Schnittstellen (C#-Programmierhandbuch)
Indexer können für eine Schnittstelle deklariert werden. Accessoren für Schnittstellenindexer unterscheiden sich von den Accessoren für Klassen-Indexer in den folgenden Punkten:
- Schnittstellenaccessoren verwenden keine Modifizierer.
- Schnittstellenzugriffsmethoden weisen in der Regel keinen Text auf.
Der Zweck einer Zugriffsmethode besteht darin, anzugeben, ob der Indexer gleichzeitig Lese- und Schreibzugriff, nur Lesezugriff oder nur Schreibzugriff besitzt. In seltenen Fällen können Sie eine Implementierung für einen in einer Schnittstelle definierten Indexer angeben. Indexer definieren üblicherweise eine API für den Zugriff auf Datenfelder, und Datenfelder können nicht in einer Schnittstelle definiert werden.
Das folgende Beispiel zeigt den Accessor für einen Schnittstellenindexer:
public interface ISomeInterface
{
//...
// Indexer declaration:
string this[int index]
{
get;
set;
}
}
Die Signatur eines Indexers muss sich von den Signaturen aller anderen in derselben Schnittstelle deklarierten Indexer unterscheiden.
Beispiel
Das folgende Beispiel zeigt, wie Schnittstellenindexer implementiert werden.
// Indexer on an interface:
public interface IIndexInterface
{
// Indexer declaration:
int this[int index]
{
get;
set;
}
}
// Implementing the interface.
class IndexerClass : IIndexInterface
{
private int[] arr = new int[100];
public int this[int index] // indexer declaration
{
// The arr object will throw IndexOutOfRange exception.
get => arr[index];
set => arr[index] = value;
}
}
IndexerClass test = new IndexerClass();
System.Random rand = System.Random.Shared;
// Call the indexer to initialize its elements.
for (int i = 0; i < 10; i++)
{
test[i] = rand.Next();
}
for (int i = 0; i < 10; i++)
{
System.Console.WriteLine($"Element #{i} = {test[i]}");
}
/* Sample output:
Element #0 = 360877544
Element #1 = 327058047
Element #2 = 1913480832
Element #3 = 1519039937
Element #4 = 601472233
Element #5 = 323352310
Element #6 = 1422639981
Element #7 = 1797892494
Element #8 = 875761049
Element #9 = 393083859
*/
Im vorherigen Beispiel könnte der Schnittstellenmember durch Verwendung des vollqualifizierten Namens des Schnittstellenmembers explizit implementiert werden. Beispiel:
string IIndexInterface.this[int index]
{
}
Der vollqualifizierte Name ist jedoch nur erforderlich, um Mehrdeutigkeiten zu vermeiden, wenn mehr als eine Schnittstelle mit derselben Indexersignatur von der Klasse implementiert wird. Wenn z.B. eine Employee
-Klasse die beiden Schnittstellen ICitizen
und IEmployee
implementiert und beide Schnittstellen dieselbe Indexersignatur besitzen, ist die explizite Implementierung des Schnittstellenmembers erforderlich. Das bedeutet, dass die folgende Indexerdeklaration:
string IEmployee.this[int index]
{
}
Implementiert den Indexer für die Schnittstelle IEmployee
. Dahingegen implementiert die folgende Deklaration:
string ICitizen.this[int index]
{
}
Implementiert den Indexer für die Schnittstelle ICitizen
.