Programiranje

Kako delati z generiki v jeziku C #

C # je močno tipkan jezik. To pomeni, da morate pri uporabi C # prijaviti tip, preden v njega shranite podatke. Čeprav ta vrsta varnosti pomaga uveljaviti varnost in interoperabilnost med jeziki, ki ciljajo na upravljano okolje, ste kot razvijalec omejeni na določanje vrste katerega koli predmeta, s katerim morate delati.

V redu, kaj pa, če želite podatke shraniti v varno zbirko brez kakršnih koli dodatnih stroškov? Tu so generiki na pomoč.

Generiki vam omogočajo delo s podatki, varnimi za tipe, brez dodatnih stroškov. Generike lahko izkoristite za ustvarjanje varnih zbirk vrst, pa tudi razrede in metode, ki lahko sprejmejo tip kot parameter. Takšni razredi, ki so enkrat razglašeni, lahko delujejo s katero koli vrsto. To pomaga, da je vaša koda veliko bolj obvladljiva, razširljiva, vzdržna in učinkovita. V tem članku bi raziskovali generike in kako jih je mogoče uporabiti s programskim jezikom C #.

Generiki vam pomagajo uvesti algoritme, ki lahko delujejo na najrazličnejših vrstah. Kot primer boste morda želeli napisati algoritem za razvrščanje polja celih števil ali dvojnic ali celo polja nizov. Za izvajanje takšnih algoritmov za razvrščanje brez generičnih zdravil bi običajno potrebovali več načinov razvrščanja - po enega na vsako vrsto.

Ko deklarirate razred ali metodo s pomočjo parametrov tipa, lahko določite vrsto, s katero bi razredi ali metode delovale, dokler ne dostopate do teh razredov in metod iz odjemalske kode. Generics spodbuja varnost tipov, vzdrževanje kode, učinkovitost kode in izboljšano delovanje. Upoštevajte, da lahko generike izkoristite za izvajanje lastnih generičnih razredov, vmesnikov, metod, dogodkov in delegatov.

Ko uporabljate generike, vam ni treba več vnašati predmetov na ustrezne vrste - informacije o tipu so dobro dokumentirane v vaši kodi. Ko uporabljate generične podatke, prevajalnik na vaši kodi preveri čas prevajanja glede skladnosti z varnostnim tipom. Koda, ki uporablja generike, je vedno posledica izogibanja režijskim stroškom za boks in odpakiranje.

Naslednji seznam kode prikazuje tri metode za razvrščanje vhodnih podatkov - za vsako vrsto potrebujete en način razvrščanja.

javni statični int [] Razvrsti (int [] celo številoArray)

  {

// Koda za razvrščanje polja celih števil

vrni celo številoArray;

  }

javni statični niz [] Razvrsti (niz [] stringArray)

  {

// Koda za razvrščanje niza nizov

vrni stringArray;

  }

javno dvojno [] Razvrsti (dvojno [] doubleArray)

  {

// Koda za razvrščanje polja dvojic

vrni doubleArray;

  }

Če uporabljate Generics, lahko imate samo eno metodo, ki lahko sprejme parameter tipa in razvrsti vhodne podatke, ko vas to vpraša.

javni razred Algoritem

    {

javni statični T [] Razvrsti (T [] inputArray)

        {

// Koda za razvrščanje generičnega polja

vrni inputArray;

        }

    }

Omejitve parametrov tipa

Pri delu z generiki se morate zavedati splošnih omejitev, ki vključujejo: omejitve izpeljave in privzete omejitve konstruktorja. Omejitve izpeljave se uporabljajo za določitev vmesnika ali razreda, ki bi se uporabil za določitev izpeljanke za generični tip.

Tu je primer, ki ponazarja, kako vmesnik ILogger je bil uporabljen za omejitev parametra tipa T (pri določanju DBLogger razred), da je takega tipa ILogger vmesnik.

javni vmesnik ILogger

    {

// Nekaj ​​kode

    }

javni razred DBLogger, kjer je T: ILogger

    {

// Nekaj ​​kode

    }

Parametri splošnega tipa so lahko vrednostni ali referenčni. Kot primer lahko na kateri koli od naslednjih načinov definirate svoj razred, ki vsebuje parameter splošnega tipa.

javni razred FileLogger, kjer je T: razred

    {

// Nekaj ​​kode

    }

javni razred BaseLogger, kjer je T: int

    {

// Nekaj ​​kode

    }

Omejitev konstruktorja se uporablja za uveljavitev privzetega konstruktorja za parameter generičnega tipa. Tu je primer, ki ponazarja ta koncept.

razred DBLogger, kjer T: new () // Parameter splošnega tipa T mora imeti privzeti konstruktor

{

// Nekaj ​​kode

}

Pri delu z dedovanjem lahko uporabite tudi generične parametre tipa. Tu je primer, ki prikazuje, kako lahko to dosežete. Upoštevajte, da mora imeti splošni parameter tipa v naslednjem primeru privzeti konstruktor.

javni razred BaseLogger

    {

// Nekaj ​​kode

    }

javni razred FileLogger: BaseLogger, kjer je T: novo ()

    {

// Nekaj ​​kode

    }

Naslednji seznam kod prikazuje, kako je mogoče uporabiti generične metode.

javni razred BaseLogger

    {

javna praznina Inicializacija (T t)

        {

// Koda za inicializacijo zapisovalnika

        }

    }

Glejte zgornji delček kode. Upoštevajte, kako je bil parameter generičnega tipa uporabljen kot parameter v Inicializiraj () metoda. Več o generikih bi razpravljal v naslednjih objavah tukaj. Več o generičnih zdravilih lahko izveste tukaj: //msdn.microsoft.com/en-us/library/512aeb7t.aspx

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