Kako raditi s generičkim lijekovima u C #

C # je jako otkucan jezik. To podrazumijeva da biste prilikom korištenja C # trebali deklarirati tip prije nego što u njega pohranite podatke. Iako ova vrsta sigurnosti pomaže u provođenju sigurnosti i interoperabilnosti između jezika koji ciljaju upravljano okruženje, vi ste kao programer ograničeni na definiranje vrste bilo kojeg objekta s kojim trebate raditi.

U redu, ali što ako želite pohraniti podatke u sigurnu zbirku bez bilo kakvih troškova boksa i raspakiranja? Evo generičkih lijekova u pomoć.

Generički podaci omogućuju vam rad s podacima sigurnim u tipu bez pretjeranog boksanja i otpakiranja. Možete koristiti generičke lijekove za stvaranje zbirki sigurnih tipova, kao i klase i metode koje mogu prihvatiti vrstu kao parametar. Takve klase jednom proglašene mogu raditi s bilo kojom vrstom. To pomaže vašem kodu da bude puno upravljiviji, proširiviji, održiviji i učinkovitiji. U ovom ćemo članku istražiti generičke lijekove i kako se mogu implementirati pomoću programskog jezika C #.

Generički vam pomažu u primjeni algoritama koji mogu raditi na najrazličitijim vrstama. Kao primjer, možda ćete htjeti napisati algoritam za sortiranje niza cijelih brojeva ili parova ili čak niza nizova. Da biste implementirali takve algoritme sortiranja bez generičkih lijekova, obično vam treba više metoda sortiranja - po jedna za svaku vrstu.

Nakon što deklarirate klasu ili metodu pomoću parametara tipa, možete odgoditi specificiranje vrste s kojom bi klase ili metode radile do trenutka dok se tim klasama i metodama pristupa iz klijentskog koda. Generics promiče sigurnost tipova, održavanje koda, učinkovitost koda i poboljšane performanse. Imajte na umu da generičke lijekove možete koristiti za implementaciju vlastitih generičkih klasa, sučelja, metoda, događaja i delegata.

Kada upotrebljavate generičke lijekove, više ne morate tipkati objekte prema odgovarajućim vrstama - podaci o tipu dobro su dokumentirani u vašem kodu. Kada koristite generičke podatke, prevodilac vrši provjeru vremena sastavljanja na vašem kodu radi usklađenosti s tipom sigurnosti. Kôd koji koristi generičke lijekove uvijek je posljedica izbjegavanja režima boksa i raspakiranja.

Sljedeći popis kodova prikazuje tri metode koje sortiraju ulazne podatke - za svaku vrstu potrebna vam je jedna metoda sortiranja.

public static int[] Sort(int[] integerArray)

  {

      //Code to sort an array of integers

      return integerArray;

  }

public static string[] Sort(string[] stringArray)

  {

      //Code to sort an array of strings

      return stringArray;

  }

public double[] Sort(double[] doubleArray)

  {

      //Code to sort an array of doubles

      return doubleArray;

  }

Ako koristite Generics, možete imati samo jednu metodu koja može prihvatiti parametar tipa i razvrstati ulazne podatke kada se to zatraži.

public class Algorithm

    {

        public static T[] Sort(T[] inputArray)

        {

            //Code to sort a generic array

            return inputArray;

        }

    }

Ograničenja tipa parametra

Kada radite s generičkim lijekovima, trebali biste biti svjesni generičkih ograničenja koja uključuju: ograničenja izvođenja i zadana ograničenja konstruktora. Ograničenja izvođenja koriste se za specificiranje sučelja ili klase koja bi se koristila za definiranje izvedenice za generički tip.

Evo primjera koji ilustrira na koji interface ILoggerje način korišten za ograničavanje parametra tipa T (prilikom definiranja DBLoggerklase) da bude ILoggersučelja tipa .

public interface ILogger

    {

        //Some code

    }

    public class DBLogger where T : ILogger

    {

        //Some code

    }

Parametri vašeg generičkog tipa mogu biti vrijednosni ili referentni. Kao primjer, možete definirati svoju klasu koja sadrži parametar generičkog tipa na bilo koji od sljedećih načina.

public class FileLogger where T : class

    {

        //Some code

    }

 public class BaseLogger where T: int

    {

        //Some code

    }

Ograničenje konstruktora koristi se za nametanje zadanog konstruktora za parametar generičkog tipa. Evo primjera koji ilustrira ovaj koncept.

class DBLogger where T : new() // The generic type parameter T must have a default constructor

{

   //Some code

}

Također možete koristiti generičke parametre tipa kada radite s nasljeđivanjem. Evo primjera koji pokazuje kako to možete postići. Imajte na umu da bi parametar generičkog tipa u sljedećem primjeru trebao imati zadani konstruktor.

public class BaseLogger

    {

        //Some code

    }

    public class FileLogger : BaseLogger where T : new()

    {

        //Some code

    }

Sljedeći popis koda pokazuje kako se generičke metode mogu implementirati.

public class BaseLogger

    {

        public void Initialize(T t)

        {

          //Code to initialize logger

        }

    }

Pogledajte gore navedeni isječak koda. Imajte na umu kako je parametar generičkog tipa korišten kao parametar u Initialize()metodi. O svojim generičkim lijekovima raspravljao bih više u svojim budućim postovima ovdje. Više o generičkim lijekovima možete saznati ovdje: //msdn.microsoft.com/en-us/library/512aeb7t.aspx