Paweł Łukasiewicz
2015-04-04
Paweł Łukasiewicz
2015-04-04
Udostępnij Udostępnij Kontakt

Indeksery pozwalają na indeksowanie obiektów w taki sam sposób jak ma to miejsce w tablicach. Kiedy definiujemy indeksery dla klas, zachowuje się ona w podobny sposób do wirtualnej tablicy. Można uzyskać dostęp do instancji tej klasy przy użyciu operatora dostępu do tablicy, tj. ([]).

Składnia definicji jednowymiarowego indeksera:
typ_elementu this[int index]
{
    get
    {
        // zwracanie wartości wskazanej przez indeks
    }
    set
    {
        // ustawienie wartości wskazanej przez indeks
    }
}

Używanie indekserów

Deklaracja zachowania indeksera jest pewnym sensie podoba do właściwości. Deklarując indekser również będziemy używać akcesorów get oraz set. Jednakże, właściwość zwróci lub ustawi dane dla konkretnego elementu, podczas gdy indekser zwróci lub ustawi konkretną wartość z instancji obiektu. Innymi słowy, zbiór danych zostaje podzielony na mniejsze części a indekser zwraca lub ustawia wartości dla poszczególnych elementów.

Definiowanie właściwości składa się z określenia nazwy. W przypadku indekserów nie używamy nazwy, ale słowa kluczowego this, które wskazuje na instancje obiektu. Poniższy przykład w przystępniejszy sposób pozwoli na zapoznanie się z użyciem indekserów:

using System;
namespace Indeksery
{
    class Program
    {
        // lista naszych nazw
        private string[] nameList = new string[size];
        // rozmiar
        static int size = 10;
        static void Main(string[] args)
        {
            Program names = new Program();
            names[0] = "Audi";
            names[1] = "Pagani";
            names[2] = "BMW";
            names[3] = "Nissan";
            for (int i = 0; i < size; i++)
            {
                Console.WriteLine(names[i]);
            }
            Console.ReadKey();
        }
        // Konstruktor klasy powoduje wypełnienie listy elementami 'N.A'
        public Program()
        {
            for (int i = 0; i < size; i++)
            {
                nameList[i] = "N.A";
            }
        }
        // Indekser
        public string this[int index]
        {
            get
            {
                string temp;
                if (index >= 0 && index <= size - 1)
                    temp = nameList[index];
                else
                    temp = "";
                return temp;
            }
            set
            {
                if (index >= 0 && index <= size - 1)
                    nameList[index] = value;
            }
        }
    }
}

Przeciążanie indekserów

Indeksery mogą również zostać przeciążone. Indeksery mogą być również zdefiniowane z wieloma parametrami a każdy z parametrów może być innego typu. Indeksery nie muszą być typami całkowitymi. C# dopuszcza, aby indeksery były innymi typami, np. string.

Poniższy przykład pokazuje sposób użycia indekserów przeciążonych:

using System;
namespace Indeksery
{
    class Program
    {
        // lista naszych nazw
        private string[] nameList = new string[size];
        // rozmiar
        static int size = 10;
        static void Main(string[] args)
        {
            Program names = new Program();
            names[0] = "Audi";
            names[1] = "Pagani";
            names[2] = "BMW";
            names[3] = "Nissan";
            // używanie indeksera z parametrem typu int
            for (int i = 0; i < size; i++)
            {
                Console.WriteLine(names[i]);
            }
            // użycie indeksera z parameterem typu string
            Console.WriteLine(names["BMW"]);
            Console.ReadKey();
            // Wynik działania programu
            // Audi
            // Pagani
            // BMW
            // Nissan
            // N.A
            // N.A
            // N.A
            // N.A
            // N.A
            // N.A
            // 2
        }
        // Konstruktor klasy powoduje wypełnienie listy elementami 'N.A'
        public Program()
        {
            for (int i = 0; i < size; i++)
            {
                nameList[i] = "N.A";
            }
        }
        // Indekser
        public string this[int index]
        {
            get
            {
                string temp;
                if (index >= 0 && index <= size - 1)
                    temp = nameList[index];
                else
                    temp = "";
                return temp;
            }
            set
            {
                if (index >= 0 && index <= size - 1)
                    nameList[index] = value;
            }
        }
        public int this[string name]
        {
            get
            {
                int index = 0;
                while (index < size)
                {
                    if (nameList[index] == name)
                        return index;
                    index++;
                }
                return index;
            }
        }
    }
}