Kako raditi s indeksatorima u C #

Programski jezik C # uključuje podršku za indeksere - značajku koja vam omogućuje upotrebu objekta samo kao niza. Indekseri su poznati i kao pametni nizovi i mogu se definirati slično onome kako se definira svojstvo. MSDN kaže: "Indekseri dopuštaju indeksiranje primjera klase ili strukture baš kao nizovi. Indekseri nalikuju svojstvima, osim što njihovi pristupnici uzimaju parametre."

Iako indekseri i svojstva imaju sličnosti na više načina, među njima postoje suptilne razlike. Za razliku od svojstava, indekseru možete pristupiti pomoću indeksa. Imajte na umu da svojstvu trebate pristupiti koristeći njegovo ime. Također, indekseri su članovi instance klase i stoga ne mogu biti statični. Možete imati i statička i nestatična svojstva.

Sljedeći isječak koda ilustrira kako se deklarira indeksator:

this [argument list]

{

  get

  {

  }

  Set

  {

  }

}

Imajte na umu da modifikator kao što je prikazano u deklaraciji sintakse indeksera može biti privatni, javni, zaštićeni ili interni.

Uzmite u obzir sljedeću klasu:

public class Contact

    {

        private string[] address = new string[3];

        public string this[int index]

        {

            get

            {

                return address[index];

            }

            set

            {

                address[index] = value;

            }

        }

    }

Klasa Kontakt sadrži privatnog člana s imenom i definira indeksator. Član adrese je niz tipa string. Evo kako možete stvoriti instancu klase Kontakt i koristiti indeksator.

Contact contact = new Contact();

 contact[0] = "Begumpet";

 contact[1] = "Hyderabad";

 contact[2] = "Telengana";

for (int i = 0; i < 3; i++)

Console.WriteLine (contact[i]);

Treba napomenuti da za definiranje indeksatora trebate koristiti ključnu riječ "this". Imajte na umu da niste ograničeni na korištenje samo cijelih brojeva kao indeksa za pristup indeksatorima - čak možete koristiti i druge mehanizme pretraživanja. Indeksator se obično koristi kada vaša klasa predstavlja kolekciju ili objekte. Tada možete koristiti indeksator za pristup određenom elementu pomoću indeksa.

Isprobajmo primjer. Razmotrite sljedeću klasu pod nazivom Kupac.

public class Customer

    {

       public List Orders

        {

            get; set;

        }

       public Order this[int orderID]

        {

            get

            {

                return (from o in Orders

                        where o.OrderID == orderID

                        select o).First();

            }

        }

    }

Klasa Customer definira indeksator tipa Order. Sadrži i javno svojstvo koje je popis tipa Order. Evo klase Order za vašu referencu.

public class Order

    {

        public int OrderID

        {

            get; set;

        }

    }

Sljedeći isječak koda ilustrira kako možete pristupiti indeksatoru klase Customer da biste dohvatili određenu narudžbu.

   List lstOrder = new List();

  Order o1 = new Order();

  o1.OrderID = 1;

  Order o2 = new Order();

  o2.OrderID = 2;           

  lstOrder.Add(o1);

  lstOrder.Add(o2);

  Customer customer = new Customer();

  customer.Orders = lstOrder;

  Order o = customer[1];

Pogledajte isječak koda gore. Primijetite kako je generirani popis tipa Order stvoren i dodijeljen svojstvu Orders instance kupca klase. Dalje, samo prosljeđujete OrderId kao parametar za dohvaćanje određene instance narudžbe.

Indekseri podržavaju nasljeđivanje, mogu biti polimorfni, a mogu biti i apstraktni. Razmotrite sljedeću klasu koja definira virtualni indeksator. Klasa ContactBase modificirana je verzija klase Contact o kojoj smo raspravljali ranije u ovom članku.

 public class ContactBase

    {

        protected string[] address = new string[3];

        public virtual string this[int index]

        {

            get

            {

                return address[index];

            }

            set

            {

                address[index] = value;

            }

        }

    }

Sada možete izvesti klasu iz klase ContactBase i poništiti indeksator kao što je prikazano u nastavku.

public class ConcreteContact: ContactBase

    {

       public override string this[int index]

        {

            get

            {

                return address[index];

            }

            set

            {

                address[index] = value;

            }

        }

    }

Dakle, u gornjem primjeru koda istražili smo kako se indekseri mogu koristiti tijekom nasljeđivanja tipova i kako mogu pokazati polimorfno ponašanje.

Indekser možete definirati jednako dobro kao i apstraktni. Da biste to učinili, morate stvoriti apstraktnu klasu, a zatim unutar nje definirati indeksator kao apstraktni. Izmijenimo klasu ContactBase i definirajmo indeksator kao apstraktni. Evo kako bi sada izgledala modificirana verzija klase ContactBase:

 public abstract class ContactBase

    {

        protected string[] address = new string[3];

        public abstract string this[int index]

        {

            get; set;

        }

}

Klasu ConcreteContact ionako ne trebate mijenjati. Sada možete iskoristiti indeksator za dodjeljivanje vrijednosti niza instanci klase ConcreteContact kao što je prikazano dolje.

ConcreteContact contact = new ConcreteContact();

contact[0] = "Begumpet";

contact[1] = "Hyderabad";

contact[2] = "Telengana";