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.