Programovanie

Ako pracovať s indexátormi v C #

Programovací jazyk C # obsahuje podporu indexerov - funkciu, ktorá umožňuje používať objekt rovnako ako pole. Indexátory sú tiež známe ako inteligentné polia a dajú sa definovať podobne, ako sa definuje vlastnosť. MSDN uvádza: "Indexery umožňujú inštancie triedy alebo štruktúry indexovať rovnako ako polia. Indexátory pripomínajú vlastnosti, okrem toho, že ich prístupoví operátori majú parametre."

Aj keď indexátory a vlastnosti majú podobnosti vo viacerých ohľadoch, sú medzi nimi jemné rozdiely. Na rozdiel od vlastností môžete k indexátoru pristupovať pomocou indexov. Nezabudnite, že k nehnuteľnosti musíte získať prístup pomocou jej názvu. Indexátory sú tiež inštančnými členmi triedy, a preto nemôžu byť statické. Môžete mať statické aj nestatické vlastnosti.

Nasledujúci úryvok kódu ilustruje, ako sa deklaruje indexátor:

tento [zoznam argumentov]

{

dostať

  {

  }

Nastaviť

  {

  }

}

Upozorňujeme, že modifikátor zobrazený v deklarácii syntaxe indexera môže byť súkromný, verejný, chránený alebo interný.

Zvážte nasledujúcu triedu:

verejná trieda Kontakt

    {

súkromný reťazec [] adresa = nový reťazec [3];

verejný reťazec tento [int index]

        {

dostať

            {

spiatočná adresa [index];

            }

nastaviť

            {

adresa [index] = hodnota;

            }

        }

    }

Trieda Kontakt obsahuje súkromného člena s názvom adresa a definuje indexátor. Členom adresy je pole typového reťazca. Tu je príklad, ako môžete vytvoriť inštanciu triedy Contact a použiť indexer.

Kontaktný kontakt = nový Kontakt ();

kontakt [0] = "Begumpet";

kontakt [1] = "Hyderabad";

kontakt [2] = "Telengana";

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

Console.WriteLine (kontakt [i]);

Je potrebné poznamenať, že na definovanie indexerov musíte použiť kľúčové slovo „toto“. Upozorňujeme, že pri prístupe k indexovačom nie ste nútení používať iba celé čísla ako indexy - môžete dokonca použiť aj iné mechanizmy vyhľadávania. Indexátor sa zvyčajne používa, keď vaša trieda predstavuje kolekciu alebo objekty. Potom môžete použiť indexer na prístup ku konkrétnemu prvku pomocou indexu.

Skúsme príklad. Zvážte nasledujúcu triedu s názvom Zákazník.

verejná trieda Zákazník

    {

verejné zoznamy objednávok

        {

dostať; sada;

        }

verejná objednávka tento [int ID_objednávky]

        {

dostať

            {

návrat (od o v objednávkach

kde o.OrderID == IDObjednávky

vyberte o). Najprv ();

            }

        }

    }

Trieda Zákazník definuje indexátor typu Order. Obsahuje tiež verejné vlastníctvo, ktoré je zoznamom typu Order. Tu je trieda objednávky pre vašu referenciu.

verejná trieda Objednávka

    {

public int OrderID

        {

dostať; sada;

        }

    }

Nasledujúci úryvok kódu ilustruje, ako môžete získať prístup k indexátoru triedy Customer a načítať konkrétnu objednávku.

   Zoznam lstOrder = nový Zoznam ();

Objednávka o1 = nová objednávka ();

o1.OrderID = 1;

Objednávka o2 = nová objednávka ();

o2.OrderID = 2;

lstOrder.Add (o1);

lstOrder.Add (o2);

Zákazník zákazník = nový Zákazník ();

customer.Orders = lstOrder;

Objednávka o = zákazník [1];

Prečítajte si útržok kódu vyššie. Všimnite si, ako bol vytvorený všeobecný zoznam typu Order a priradený k vlastnosti Orders inštancie triedy Customer. Ďalej iba odovzdáte OrderId ako parameter na načítanie konkrétnej inštancie objednávky.

Indexátory podporujú dedičnosť, môžu byť polymorfné a môžu byť aj abstraktné. Zvážte nasledujúcu triedu, ktorá definuje indexátor, ktorý je virtuálny. Trieda ContactBase je upravená verzia triedy Contact, o ktorej sme hovorili vyššie v tomto článku.

verejná trieda ContactBase

    {

chránený reťazec [] adresa = nový reťazec [3];

verejný virtuálny reťazec tento [int index]

        {

dostať

            {

spiatočná adresa [index];

            }

nastaviť

            {

adresa [index] = hodnota;

            }

        }

    }

Teraz môžete odvodiť triedu z triedy ContactBase a prepísať indexer, ako je znázornené nižšie.

verejná trieda ConcreteContact: ContactBase

    {

reťazec verejného prepísania tento [int index]

        {

dostať

            {

spiatočná adresa [index];

            }

nastaviť

            {

adresa [index] = hodnota;

            }

        }

    }

Vo vyššie uvedenom príklade kódu sme teda preskúmali, ako je možné indexátory používať pri dedení typov a ako môžu vykazovať polymorfné správanie.

Môžete rovnako dobre definovať indexer ako abstraktný. Aby ste to dosiahli, musíte vytvoriť abstraktnú triedu a potom v nej definovať indexer ako abstraktný. Poďme upraviť triedu ContactBase a definovať indexer ako abstraktný. Takto by teraz vyzerala upravená verzia triedy ContactBase:

 verejná abstraktná trieda ContactBase

    {

chránený reťazec [] adresa = nový reťazec [3];

verejný abstraktný reťazec tento [int index]

        {

dostať; sada;

        }

}

Triedu ConcreteContact rovnako nemusíte meniť. Teraz môžete indexer využiť na priradenie reťazcových hodnôt inštancii triedy ConcreteContact, ako je uvedené nižšie.

ConcreteContact kontakt = nový ConcreteContact ();

kontakt [0] = "Begumpet";

kontakt [1] = "Hyderabad";

kontakt [2] = "Telengana";

$config[zx-auto] not found$config[zx-overlay] not found