Kako koristiti nepromjenjivost u C #

Nepromjenjivost je značajka funkcionalnih programskih jezika koja olakšava pisanje, testiranje i održavanje programa. Međutim, nepromjenjivost nije podržana od mnogih imperativnih programskih jezika. Do nedavno, C # nije podržavao nepromjenjivost izravno iz kutije. 

To se mijenja uvođenjem zapisa u C # 9, koji je dostupan za pregled u .NET 5. Međutim, nepromjenjivost možemo primijeniti u ranijim verzijama C # pomoću imenskog prostora System.Collections.Immutable, koji je dostupan kao NuGet paket. 

Nepromjenjivi objekt definiran je kao objekt koji se ne može mijenjati nakon što je stvoren. U mnogim slučajevima korištenja, poput objekata za prijenos podataka, nepromjenjivost je poželjna značajka. Ovaj članak govori o tome zašto bismo mogli iskoristiti prednost nepromjenjivosti i kako možemo primijeniti nepromjenjivost u C #.

Da biste radili s primjerima koda iz ovog članka, u sustavu biste trebali instalirati Visual Studio 2019. Ako još nemate kopiju, ovdje možete preuzeti Visual Studio 2019. 

Stvorite projekt aplikacije konzole .NET Core u Visual Studiju

Prvo, kreirajmo projekt aplikacije .NET Core konzole u Visual Studiju. Pod pretpostavkom da je Visual Studio 2019 instaliran u vašem sustavu, slijedite korake opisane u nastavku da biste u Visual Studiju stvorili novi projektni program konzole .NET Core.

  1. Pokrenite Visual Studio IDE.
  2. Kliknite "Stvori novi projekt".
  3. U prozoru "Stvori novi projekt" s popisa predložaka odaberite "Aplikacija konzole (.NET Core)".
  4. Kliknite Dalje. 
  5. U sljedećem prozoru "Konfiguriranje novog projekta" navedite naziv i mjesto za novi projekt.
  6. Kliknite Stvori. 

Ovo će stvoriti novi projektni program konzole .NET Core u Visual Studio 2019. Ovaj ćemo projekt koristiti za ilustraciju nepromjenjivosti u sljedećim odjeljcima ovog članka.

Instalirajte System.Collection.Immutable NuGet paket

Da biste radili s nepromjenjivim vrstama, trebali biste instalirati paket System.Collections.Immutable tvrtke NuGet. To možete učiniti ili putem upravitelja paketa NuGet unutar IDE-a Visual Studio 2019 ili izvršavanjem sljedeće naredbe u konzoli upravitelja paketa NuGet:

Instaliraj-paket sustav.Zbirke.Nepromjenjiv

Ovaj paket sadrži kolekciju klasa zaštićenih nitima, poznatih i kao nepromjenjive kolekcije.

Razumijevanje nepromjenjivosti i zapisa u C # 9

Objekt prijenosa podataka klasičan je primjer kada želite nepromjenjivost. Primjer DTO-a često se serijalizira tako da može biti neovisan o tehnologiji koja se koristi na kraju potrošača. Prirodno, prilikom prijenosa podatkovnog objekta između baze podataka i klijenta, željeli biste osigurati da se objekt ne može mijenjati - a to je upravo svrha DTO-a. Više o upotrebi objekata za prijenos podataka u C # možete pročitati iz mog ranijeg članka ovdje. 

Da biste stvorili nepromjenjive DTO-ove, možete iskoristiti ReadOnlyCollection ili nepromjenjive tipove zbirki koji su zaštićeni niti u prostoru System.Collections.Immutable. Alternativno, mogli biste iskoristiti vrste zapisa u C # 9 za implementaciju nepromjenjivih DTO-a.

Vrsta zapisa u C # 9 lagana je, nepromjenjiva vrsta podataka (ili lagana klasa) koja ima samo svojstva samo za čitanje. Budući da je vrsta zapisa nepromjenjiva, zaštićena je niti i ne može mutirati ili mijenjati nakon što je stvorena.

Tip zapisa možete inicijalizirati samo unutar konstruktora. Stvaranje vrste zapisa za klasu (autor u ovom primjeru) jednostavno je kao sljedeći isječak koda.

podaci klase Autor (int Id, niz firstName, string lastName, adresa niza);

Također biste mogli napisati vrstu zapisa Autor kao što je prikazano u donjem isječku koda:

klasa javnih podataka Autor {

    javni int Id {get; u tome; }

    javni niz firstName {get; u tome; }

    javni niz lastName {get; u tome; }

    adresa javnog niza {get; u tome; }

}

Obratite pažnju na upotrebu ključne riječi podataka prilikom deklariranja vrste zapisa. Ključna riječ data kada se koristi u deklaraciji klase označava tip kao zapis. Možete iskoristiti primjerak vrste zapisa za prosljeđivanje podataka kroz slojeve, istodobno osiguravajući nepromjenjivost DTO-a.

System.Collections.Nepromjenjivi prostor imena

Nepromjenjive su zbirke čiji se članovi ne mogu mijenjati nakon što su stvoreni. Prostor imena System.Collections.Imutatable sastoji se od nekoliko nepromjenjivih zbirki. Ovaj prostor imena sadrži nepromjenjive verzije popisa, rječnika, nizova, hashova, stogova i redova.

ImmutableStack se može koristiti za guranje i puštanje elemenata na sličan način kao što to radimo s promjenjivim hrpama. Međutim, budući da je ImmutableStack nepromjenjiva zbirka, njegovi se elementi ne mogu mijenjati. Dakle, kada uputite poziv pop metodi za iskakanje elementa iz stoga, novi stog se kreira za vas, a izvorni stog ostaje nepromijenjen.

Pokažimo to na primjeru. Sljedeći isječak koda pokazuje kako možete gurnuti elemente na nepromjenjivi stog.

var stog = ImmutableStack.Empty;

za (int i = 0; i <10; i ++)

{

    stog = stog.Pritisni (i);

}

Sljedeći program pokazuje da se elementi nepromjenjivog stoga ne mogu mijenjati.

razredni program

    {      

        statička praznina Main (string [] args)

        {

            var stog = ImmutableStack.Empty;

            za (int i = 0; i <10; i ++)

            {

                stog = stog.Pritisni (i);

            }

            Console.WriteLine ("Broj elemenata u izvornom stogu:

             "+ stack.Count ());

            var newStack = stack.Pop ();

            Console.WriteLine ("Broj elemenata u novom stogu:" +

            newStack.Count ());

            Console.ReadKey ();

        }

    }

Kada izvršite gornji program, evo kako bi se izlaz trebao pojaviti u prozoru konzole.

Kao što možete vidjeti na slici 1, izvorni nepromjenjivi stog (koji sadrži 10 elemenata) nepromijenjen je nakon poziva Pop () metode. Umjesto toga, izrađuje se novi nepromjenjivi stog s 9 elemenata.

Nepromjenjive kolekcije ne nude konstruktore, ali možete iskoristiti statičku tvorničku metodu koja se zove Stvori, kao što je prikazano u isječku koda koji je dat u nastavku.

var list = ImmutableList.Create (1, 2, 3, 4, 5);

Ako želite dodati ili ukloniti element iz ove zbirke, stvorit će se novi nepromjenjivi popis, a izvorni nepromjenjivi popis ostat će nepromijenjen.

Nepromjenjivost je izbor dizajna; to znači da se instanca tipa ne može mijenjati nakon što je stvorena. Osim nepromjenjivih hrpa i nepromjenjivih redova, sve se nepromjenjive zbirke temelje na AVL stablima. Stoga možete umetnuti elemente u bilo koji položaj zbirke, tj. Početak, sredinu ili kraj, bez potrebe za kopiranjem stabla u cijelosti.

Kako učiniti više u C #:

  • Kako koristiti bilješke podataka u C #
  • Kako raditi s GUID-ovima u C # 8
  • Kada koristiti apstraktnu klasu naspram sučelja u C #
  • Kako raditi s AutoMapperom u C #
  • Kako koristiti lambda izraze u C #
  • Kako raditi s delegatima Action, Func i Predicate u C #
  • Kako raditi s delegatima u C #
  • Kako implementirati jednostavni zapisnik u C #
  • Kako raditi s atributima u C #
  • Kako raditi s log4netom na C #
  • Kako implementirati obrazac dizajna spremišta u C #
  • Kako raditi s refleksijom u C #
  • Kako raditi s nadzornikom datoteka u C #
  • Kako izvesti lijenu inicijalizaciju u C #
  • Kako raditi s MSMQ-om u C #
  • Kako raditi s metodama produženja u C #
  • Kako do nas lambda izrazi u C #
  • Kada upotrijebiti hlapljivu ključnu riječ u C #
  • Kako koristiti ključnu riječ yield u C #
  • Kako implementirati polimorfizam u C #
  • Kako izraditi vlastiti planer zadataka u C #
  • Kako raditi s RabbitMQ u C #
  • Kako raditi s korpicom u C #
  • Istraživanje virtualnih i apstraktnih metoda u C #
  • Kako koristiti Dapper ORM u C #
  • Kako koristiti uzorak dizajna muhe u C #