Indexer in Schnittstellen (C#-Programmierhandbuch)

Indexer können für interface (C#-Referenz) deklariert werden. Accessoren für Schnittstellenindexer unterscheiden sich in folgenden Punkten von Accessoren für Klassen-Indexer:

  • Schnittstellenaccessoren verwenden keine Modifizierer.

  • Ein Schnittstellenaccessor besitzt keinen Textkörper.

Ein Accessor wird also verwendet, um anzugeben, ob der Indexer Lese- und Schreibzugriffe gleichzeitig bzw. jeweils nur Schreib- oder Lesezugriffe unterstützt.

Das folgende Beispiel zeigt einen 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 Indexer unterscheiden, die in derselben Schnittstelle deklariert sind.

Beispiel

Das folgende Beispiel demonstriert die Implementierung von Schnittstellenindexern:

    // Indexer on an interface:
    public interface ISomeInterface
    {
        // Indexer declaration:
        int this[int index]
        {
            get;
            set;
        }
    }

    // Implementing the interface.
    class IndexerClass : ISomeInterface
    {
        private int[] arr = new int[100];
        public int this[int index]   // indexer declaration
        {
            get
            {
                // The arr object will throw IndexOutOfRange exception.
                return arr[index];
            }
            set
            {
                arr[index] = value;
            }
        }
    }

    class MainClass
    {
        static void Main()
        {
            IndexerClass test = new IndexerClass();
            System.Random rand = new System.Random();
            // 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 #{0} = {1}", i, test[i]);
            }

            // Keep the console window open in debug mode.
            System.Console.WriteLine("Press any key to exit.");
            System.Console.ReadKey();
        }
    }
    /* 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
     */


Um im vorangehenden Beispiel die explizite Implementierung des Schnittstellenmembers zu verwenden, geben Sie den vollqualifizierten Namen des Schnittstellenmembers an. Beispiele:

public string ISomeInterface.this 
{ 
} 

Der vollqualifizierte Name wird jedoch nur benötigt, um Mehrdeutigkeiten zu vermeiden, wenn mehr als eine Schnittstelle mit der gleichen Indexersignatur von der Klasse implementiert wird. Wenn beispielsweise die beiden Schnittstellen ICitizen und IEmployee von einer Employee-Klasse implementiert werden und beide Schnittstellen über die gleiche Indexersignatur verfügen, muss der Schnittstellenmember explizit implementiert werden. Mit der folgenden Indexerdeklaration

public string IEmployee.this 
{ 
} 

wird der Indexer für die IEmployee-Schnittstelle implementiert, während mit der Deklaration

public string ICitizen.this 
{ 
} 

der Indexer für die ICitizen-Schnittstelle implementiert wird.

Siehe auch

Referenz

Indexer (C#-Programmierhandbuch)

Eigenschaften (C#-Programmierhandbuch)

Schnittstellen (C#-Programmierhandbuch)

Konzepte

C#-Programmierhandbuch