Share via


Indexeerfuncties in interfaces (C#-programmeerhandleiding)

Indexeerfuncties kunnen worden gedeclareerd op een interface. Accessors van interface-indexeerfuncties verschillen op de volgende manieren van de accessors van klasse-indexeerfuncties :

  • Interfacetoegangsors gebruiken geen modifiers.
  • Een interface-accessor heeft doorgaans geen hoofdtekst.

Het doel van de accessor is om aan te geven of de indexeerfunctie alleen-lezen, alleen-lezen of alleen-schrijven is. U kunt een implementatie bieden voor een indexeerfunctie die is gedefinieerd in een interface, maar dit is zeldzaam. Indexeerfuncties definiëren doorgaans een API voor toegang tot gegevensvelden en gegevensvelden kunnen niet worden gedefinieerd in een interface.

Hier volgt een voorbeeld van een interface-indexeerfunctietoegangsfunctie:

public interface ISomeInterface
{
    //...

    // Indexer declaration:
    string this[int index]
    {
        get;
        set;
    }
}

De handtekening van een indexeerfunctie moet verschillen van de handtekeningen van alle andere indexeerfuncties die in dezelfde interface zijn gedeclareerd.

Opmerking

In het volgende voorbeeld ziet u hoe u interface-indexeerfuncties implementeert.

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

In het voorgaande voorbeeld kunt u de expliciete implementatie van interfaceleden gebruiken met behulp van de volledig gekwalificeerde naam van het interfacelid. Bijvoorbeeld

string IIndexInterface.this[int index]
{
}

De volledig gekwalificeerde naam is echter alleen nodig om dubbelzinnigheid te voorkomen wanneer de klasse meer dan één interface met dezelfde indexeerfunctiehandtekening implementeert. Als een Employee klasse bijvoorbeeld twee interfaces ICitizen implementeert en , en IEmployeebeide interfaces dezelfde indexeerfunctiehandtekening hebben, is de expliciete implementatie van interfaceleden nodig. Dat wil gezegd, de volgende indexeerfunctiedeclaratie:

string IEmployee.this[int index]
{
}

Implementeert de indexeerfunctie op de IEmployee interface, terwijl de volgende declaratie:

string ICitizen.this[int index]
{
}

Implementeert de indexeerfunctie op de ICitizen interface.

Zie ook