Programowanie w języku C#

Indeksatory

  • 2008-01-21 17:40
  • 7 komentarzy
  • 8399 odsłon
  • Oceń ten tekst jako pierwszy
Zrozumienie artykułu wymaga znajomości: tablic, Klasy, właściwości, akcesorów.

Indeksator


Dobra praktyka programowania obiektowego mówi, że zmienne deklarowane na poziomie klasy powinny być prywatne. Jeżeli chcemy odwoływać się do nich z kodu umieszczonego poza klasą powinniśmy zaimplementować publiczne właściwości, które będą na nich operować. A co zrobić jeśli mamy tablicę zadeklarowaną na poziomie klasy? W języku C# z pomocą przychodzą nam indeksatory (ang. indexers). Zaimplementowanie indeksatora pozwala nam odwoływać się do tablicy w klasie po samej nazwie obiektu i indeksie. Istnieje tutaj jednak pewne ograniczenie, klasa zawierająca indeksator może mieć zadeklarowaną tylko jedną tablicę. Podobnie jak właściwość, indeksator musi zawierać conajmniej jeden akcesor (GET lub SET). Warto przypomnieć, że w akcesorach SET występuje niejawnie zadeklarowana zmienna przechowująca wartość przypisywaną do indeksatora.

Przykład


Poniżej przedstawiam program (aplikacja konsolowa), który pokazuje jak używać przedmiotowego mechanizmu:

using System;
using System.Collections.Generic;
using System.Text;
 
namespace programPrzykladowy
{
    class Program
    {
        static void Main(string[] args)
        {
            KlasaDniTygodnia objDniTygodnia = new KlasaDniTygodnia(); // <deklaracja i inicjalizacja obiektu />
            Console.WriteLine( objDniTygodnia[5] ); // <odwołanie się do tablicy w klasie za pomocą indeksatora />
            Console.ReadKey();
        }
    }
 
    // <przykładowa klasa implementująca indeksator>
    public class KlasaDniTygodnia
    {        
 
        private string[] nazwyDni; // <deklaracja tablicy />
 
        // <konstruktor>
        public KlasaDniTygodnia()
        {
            nazwyDni = new string[7]; // <inicjalizacja tablicy />
 
            // <przypisanie wartości elementom tablicy>        
            nazwyDni[0] = "Poniedziałek";
            nazwyDni[1] = "Wtorek";
            nazwyDni[2] = "Środa";
            nazwyDni[3] = "Czwartek";
            nazwyDni[4] = "Piątek";
            nazwyDni[5] = "Sobota";
            nazwyDni[6] = "Niedziela";
            // </przypisanie wartości elementom tablicy>        
        }
        // </konstruktor>
 
        // <indeksator>
        public string this[int indeks]
        {
            // <akcesor zwracający wartosc tablicy>
            get
            {
                return this.nazwyDni[indeks - 1];
            }
            // </akcesor zwracający wartosc tablicy>
 
            // <akcesor zapisujący wartości do tablicy>
            set
            {
                this.nazwyDni[indeks-1] = value;
            }
            // </akcesor zapisujący wartości do tablicy>
        }
        // </indeksator>
    }
    // </przykładowa klasa implementująca indeksator>
 
 
}

7 komentarzy

darekppp 2016-06-05 23:12

Nie zgadam się z " Istnieje tutaj jednak pewne ograniczenie, klasa zawierająca indeksator może mieć zadeklarowaną tylko jedną tablicę."
Klasa zawierająca indeksator może mieć wiele tablic, po prostu indeksator można zrobic na jednej tablicy, a do pozostałych odnosić się przez metody.

titolr10 2015-07-21 15:48

Tak wiem, zostałem górnikiem, ale robię to dla potomności!

@Marooned value to słowo kluczowe, więc zapewne przy takiej konstrukcji zostanie wyrzucony błąd.

Marooned 2006-05-15 13:33

Wiem, bo taką dokumentację sam tworzę. Myślałem, że to jakiś inny sposób :)

darek963 2006-05-14 18:07

Teraz nie mam dostępu do VS więc nie sprawdzę, ale wydaje mi się, że kompilator powinien wyrzucić błąd. Standard komentarzy "zapożyczony" z pewnego projektu, w którym brałem udział. Moim zdaniem bardzo przejrzysty sposób komentowania kodu.

Komentarze XML po /// to mechanizm środowiska - tworzą one automatycznie dokumentację pisanego programu (opisy metod, parametrów, itd...).

Marooned 2006-05-13 11:36

set
{this.nazwyDni[indeks-1] = value;}

zmienna 'value' jest odgórnie narzucona? nigdzie się jej nie deklaruje?

Marooned 2006-05-13 15:49

A co się stanie w takim wypadku? [sorki, że sam nie sprawdzę, chwilowe problemy ze środowiskiem]

set
{int value;
  this.nazwyDni[indeks-1] = value;
}

PS
ciekawy sposób komentarzy XMLowych - to jakiś Twój standard czy ogólny? Jak pisałem w VS 2k3 to tagi były tylko w komentarzach ///

darek963 2006-05-13 14:06

Zmienna value jest deklarowana niejawnie i przechowuje wartość przypisywaną do indeksera. Jeśli zapiszemy:

objDniTygodnia[1] = "Monday";

to string "Monday" będzie przechowywany w zmiennej value.