Programmering

Sådan arbejder du med indekserer i C #

Programmeringssproget C # inkluderer understøttelse af indeksatorer - en funktion, der giver dig mulighed for at bruge et objekt ligesom et array. Indeksatorer er også kendt som smarte arrays og kan defineres svarende til, hvordan en ejendom defineres. MSDN siger: "Indeksører tillader, at forekomster af en klasse eller struktur indekseres ligesom arrays. Indeksatorer ligner egenskaber bortset fra at deres accessors tager parametre."

Selvom indeksører og egenskaber har ligheder på flere måder end én, er der subtile forskelle mellem dem. I modsætning til egenskaber kan du få adgang til en indekser ved hjælp af indekser. Husk at du skal have adgang til en ejendom ved at bruge dens navn. Indeksatorer er også instansmedlemmer i en klasse, og de kan derfor ikke være statiske. Du kan have både statiske og ikke-statiske egenskaber.

Følgende kodestykke illustrerer, hvordan en indekser erklæres:

denne [argumentliste]

{

  {

  }

Sæt

  {

  }

}

Bemærk, at modifikatoren som vist i en indekserings syntakserklæring kan være privat, offentlig, beskyttet eller intern.

Overvej følgende klasse:

offentlig klasse Kontakt

    {

privat streng [] adresse = ny streng [3];

offentlig streng dette [int-indeks]

        {

            {

returadresse [indeks];

            }

sæt

            {

adresse [indeks] = værdi;

            }

        }

    }

Kontaktklassen indeholder et privat medlem med navnet adresse og definerer en indekser. Adressemedlemmet er en matrix af typestreng. Sådan kan du oprette en forekomst af kontaktklassen og bruge indekseren.

Kontaktkontakt = ny kontakt ();

kontakt [0] = "Begumpet";

kontakt [1] = "Hyderabad";

kontakt [2] = "Telengana";

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

Console.WriteLine (kontakt [i]);

Det skal bemærkes, at du skal bruge nøgleordet "dette" til at definere indekserer. Bemærk, at du ikke er begrænset til kun at bruge heltal som indekser for at få adgang til indeksatorer - du kan endda bruge andre opslagsmekanismer også. En indekser bruges typisk, når din klasse repræsenterer en samling eller objekter. Du kan derefter bruge indekser til at få adgang til et bestemt element ved hjælp af indeks.

Lad os prøve et eksempel. Overvej følgende klasse med navnet Kunden.

offentlig klasse kunde

    {

offentlige listeordrer

        {

få; sæt;

        }

public Bestil dette [int orderID]

        {

            {

retur (fra o i ordrer

hvor o.OrderID == orderID

vælg o). Første ();

            }

        }

    }

Kundeklassen definerer en indeksator af typen Order. Den indeholder også en offentlig ejendom, der er en liste over typen Ordre. Her er ordren klasse til din reference.

offentlig klasseordre

    {

offentlig int OrderID

        {

få; sæt;

        }

    }

Følgende kodestykke illustrerer, hvordan du kan få adgang til indeksøren i kundeklassen for at hente en bestemt ordre.

   Liste lstOrder = ny liste ();

Ordre o1 = ny ordre ();

o1.OrderID = 1;

Ordre o2 = ny ordre ();

o2.OrderID = 2;

lstOrder.Add (o1);

lstOrder.Tilføj (o2);

Kundekunde = ny kunde ();

kunde.Bestillinger = lstBestilling;

Bestil o = kunde [1];

Se kodestykket ovenfor. Bemærk, hvordan en generisk liste af typen Order er oprettet og tildelt ordreegenskaben for en forekomst af kundeklassen. Dernæst sender du bare OrderId som en parameter for at hente den bestemte ordreinstans.

Indekserer understøtter arv, kan være polymorfe og kan også være abstrakte. Overvej følgende klasse, der definerer en indeksator, der er virtuel. ContactBase-klassen er en modificeret version af den kontaktklasse, vi diskuterede tidligere i denne artikel.

offentlig klasse ContactBase

    {

beskyttet streng [] adresse = ny streng [3];

offentlig virtuel streng dette [int-indeks]

        {

            {

returadresse [indeks];

            }

sæt

            {

adresse [indeks] = værdi;

            }

        }

    }

Du kan nu aflede en klasse fra ContactBase-klassen og tilsidesætte indeksøren som vist nedenfor.

offentlig klasse BetonKontakt: ContactBase

    {

offentlig tilsidesættelse streng dette [int-indeks]

        {

            {

returadresse [indeks];

            }

sæt

            {

adresse [indeks] = værdi;

            }

        }

    }

Så i kodeeksemplet ovenfor undersøgte vi, hvordan indeksatorer kan bruges, mens de arver typer, og hvordan de kan vise polymorf adfærd.

Du kan lige så godt definere en indeksator som abstrakt. For at gøre dette skal du oprette en abstrakt klasse og derefter definere en indeksator som abstrakt inde i den. Lad os ændre ContactBase-klassen og definere indekseren som abstrakt. Sådan ser den ændrede version af ContactBase-klassen nu ud:

 offentlig abstrakt klasse ContactBase

    {

beskyttet streng [] adresse = ny streng [3];

offentlig abstrakt streng dette [int-indeks]

        {

få; sæt;

        }

}

Du behøver ikke alligevel at ændre ConcreteContact-klassen. Du kan nu udnytte indeksøren til at tildele strengværdier til en forekomst af ConcreteContact-klassen som vist nedenfor.

ConcreteContact-kontakt = ny ConcreteContact ();

kontakt [0] = "Begumpet";

kontakt [1] = "Hyderabad";

kontakt [2] = "Telengana";