Dela via


Indexerare i gränssnitt (C#-programmeringsguide)

Indexerare kan deklareras i ett gränssnitt. Åtkomst till gränssnittsindexerare skiljer sig från åtkomsterna för klassindexerare på följande sätt:

  • Gränssnittsåtkomster använder inte modifierare.
  • En gränssnittsåtkomst har vanligtvis ingen brödtext.

Syftet med accessorn är att ange om indexeraren är skrivskyddad, skrivskyddad eller skrivskyddad. Du kan ange en implementering för en indexerare som definierats i ett gränssnitt, men det är ovanligt. Indexerare definierar vanligtvis ett API för åtkomst till datafält och datafält kan inte definieras i ett gränssnitt.

Följande är ett exempel på en gränssnittsindexerare:

public interface ISomeInterface
{
    //...

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

Signaturen för en indexerare måste skilja sig från signaturerna för alla andra indexerare som deklarerats i samma gränssnitt.

Exempel

I följande exempel visas hur du implementerar gränssnittsindexerare.

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

I föregående exempel kan du använda den explicita implementeringen av gränssnittsmedlemmen med hjälp av det fullständigt kvalificerade namnet på gränssnittsmedlemmen. Till exempel

string IIndexInterface.this[int index]
{
}

Det fullständigt kvalificerade namnet behövs dock bara för att undvika tvetydighet när klassen implementerar fler än ett gränssnitt med samma indexeraresignatur. Om en Employee klass till exempel implementerar ICitizen två gränssnitt och IEmployee, och båda gränssnitten har samma indexeraresignatur, krävs den explicita implementeringen av gränssnittsmedlemmen. Det vill: följande indexerardeklaration:

string IEmployee.this[int index]
{
}

Implementerar indexeraren i IEmployee gränssnittet, medan följande deklaration:

string ICitizen.this[int index]
{
}

Implementerar indexeraren i ICitizen gränssnittet.

Se även