Condividi tramite


Indicizzatori nelle interfacce (Guida per programmatori C#)

Aggiornamento: novembre 2007

Gli indicizzatori possono essere dichiarati su una interface (Riferimenti per C#). Le funzioni di accesso degli indicizzatori di interfaccia differiscono dalle funzioni di accesso degli indicizzatori di classe per i seguenti aspetti:

  • Le funzioni di accesso di interfaccia non utilizzano modificatori.

  • Una funzione di accesso di interfaccia non include un corpo.

Lo scopo della funzione di accesso è pertanto quello di indicare se l'indicizzatore è in lettura/scrittura, in sola lettura o in sola scrittura.

Nell'esempio seguente viene illustrata la funzione di accesso di un indicizzatore di interfaccia:

public interface ISomeInterface
{
    //...

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

È necessario che la firma di un indicizzatore sia diversa dalle firme di tutti gli altri indicizzatori dichiarati nella stessa interfaccia.

Esempio

Nell'esempio seguente viene illustrata la modalità di implementazione degli indicizzatori di interfaccia:

// 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();
        // Call the indexer to initialize the elements #2 and #5.
        test[2] = 4;
        test[5] = 32;
        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();
    }
}
/* Output:
    Element #0 = 56.2
    Element #1 = 56.7
    Element #2 = 56.5
    Element #3 = 58.3
    Element #4 = 58.8
    Element #5 = 60.1
    Element #6 = 65.9
    Element #7 = 62.1
    Element #8 = 59.2
    Element #9 = 57.5
*/

Nell'esempio precedente era possibile utilizzare l'implementazione esplicita del membro dell'interfaccia, utilizzando il nome completo del membro dell'interfaccia. Ad esempio:

public string ISomeInterface.this 
{ 
} 

Tuttavia, il nome completo è necessario unicamente per evitare l'ambiguità quando la classe implementa più di un'interfaccia con la stessa firma di indicizzatore. Se ad esempio la classe Employee implementa due interfacce, ICitizen e IEmployee, ed entrambe le interfacce hanno la stessa firma di indicizzatore, sarà necessaria l'implementazione esplicita del membro dell'interfaccia. In altre parole, deve essere utilizzata la seguente dichiarazione di indicizzatore:

public string IEmployee.this 
{ 
} 

implementa l'indicizzatore nell'interfaccia IEmployee, mentre la seguente dichiarazione:

public string ICitizen.this 
{ 
} 

implementa l'indicizzatore nell'interfaccia ICitizen.

Vedere anche

Attività

Esempi di indicizzatori

Concetti

Guida per programmatori C#

Riferimenti

Indicizzatori (Guida per programmatori C#)

Proprietà (Guida per programmatori C#)

Interfacce (Guida per programmatori C#)