Indexer in Schnittstellen (C#-Programmierhandbuch)Indexers in Interfaces (C# Programming Guide)

Indexer können für eine Schnittstelle deklariert werden.Indexers can be declared on an interface. Accessoren für Schnittstellenindexer unterscheiden sich von den Accessoren für Klassen-Indexer in den folgenden Punkten:Accessors of interface indexers differ from the accessors of class indexers in the following ways:

  • Schnittstellenaccessoren verwenden keine Modifizierer.Interface accessors do not use modifiers.

  • Ein Schnittstellenaccessor enthält keinen Text.An interface accessor does not have a body.

Der Zweck eines Accessors besteht darin anzugeben, ob der Indexer gleichzeitig Lese- und Schreibzugriff, nur Lesezugriff oder nur Schreibzugriff besitzt.Thus, the purpose of the accessor is to indicate whether the indexer is read-write, read-only, or write-only.

Das folgende Beispiel zeigt den Accessor für einen Schnittstellenindexer:The following is an example of an interface indexer accessor:

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.The signature of an indexer must differ from the signatures of all other indexers declared in the same interface.

BeispielExample

Das folgende Beispiel zeigt, wie Schnittstellenindexer implementiert werden.The following example shows how to implement interface indexers.

// 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
 */

Im vorherigen Beispiel könnte der Schnittstellenmember durch Verwendung des vollqualifizierten Namens des Schnittstellenmembers explizit implementiert werden.In the preceding example, you could use the explicit interface member implementation by using the fully qualified name of the interface member. Zum Beispiel:For example:

public string ISomeInterface.this   
{   
}   

Der vollqualifizierte Name ist jedoch nur erforderlich, um Mehrdeutigkeiten zu vermeiden, wenn mehr als eine Schnittstelle mit derselben Indexersignatur von der Klasse implementiert wird.However, the fully qualified name is only needed to avoid ambiguity when the class is implementing more than one interface with the same indexer signature. 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.For example, if an Employee class is implementing two interfaces, ICitizen and IEmployee, and both interfaces have the same indexer signature, the explicit interface member implementation is necessary. Das bedeutet, dass die folgende Indexerdeklaration:That is, the following indexer declaration:

public string IEmployee.this   
{   
}   

den Indexer für die Schnittstelle IEmployee implementiert. Dahingegen implementiert die folgende Deklaration:implements the indexer on the IEmployee interface, while the following declaration:

public string ICitizen.this   
{   
}   

den Indexer für die Schnittstelle ICitizen.implements the indexer on the ICitizen interface.

Siehe auchSee Also

C#-ProgrammierhandbuchC# Programming Guide
IndexerIndexers
EigenschaftenProperties
SchnittstellenInterfaces