Indicizzatori nelle interfacce (Guida per programmatori C#)

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();
            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
     */


Nell'esempio precedente era possibile utilizzare l'implementazione esplicita del membro dell'interfaccia, utilizzando il nome completo del membro dell'interfaccia. Di seguito è riportato un 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

Riferimenti

Indicizzatori (Guida per programmatori C#)

Proprietà (Guida per programmatori C#)

Interfacce (Guida per programmatori C#)

Concetti

Guida per programmatori C#