Programovanie

Ako používať nemennosť v C #

Nezmeniteľnosť je vlastnosť funkčných programovacích jazykov, ktorá uľahčuje písanie, testovanie a údržbu programov. Mnoho nevyhnutných programovacích jazykov však nemennosť nepodporuje. C # donedávna nepodporoval nemennosť ihneď po vybalení.

To sa mení zavedením záznamov v C # 9, ktoré je k dispozícii na ukážku v .NET 5. Avšak v starších verziách C # môžeme implementovať nemennosť pomocou menného priestoru System.Collections.Immutable, ktorý je k dispozícii ako balík NuGet.

Nemenný objekt je definovaný ako objekt, ktorý po vytvorení nemožno zmeniť. V mnohých prípadoch použitia, napríklad v objektoch na prenos údajov, je nemennosť žiadanou vlastnosťou. Tento článok pojednáva o tom, prečo by sme mohli chcieť využiť výhody nemennosti a ako môžeme implementovať nemennosť v C #.

Ak chcete pracovať s príkladmi kódu uvedenými v tomto článku, mali by ste mať vo svojom systéme nainštalovanú aplikáciu Visual Studio 2019. Ak ešte nemáte kópiu, môžete si tu stiahnuť Visual Studio 2019.

Vytvorte projekt konzolovej aplikácie .NET Core v Visual Studio

Najprv si vytvoríme projekt konzolovej aplikácie .NET Core v Visual Studio. Za predpokladu, že je vo vašom systéme nainštalované Visual Studio 2019, vytvorte nový projekt konzolovej aplikácie .NET Core v Visual Studio podľa pokynov uvedených nižšie.

  1. Spustite Visual Studio IDE.
  2. Kliknite na možnosť „Vytvoriť nový projekt“.
  3. V okne „Vytvoriť nový projekt“ vyberte zo zobrazeného zoznamu šablón „Console App (.NET Core)“.
  4. Kliknite na Ďalej.
  5. V nasledujúcom okne „Konfigurácia nového projektu“ zadajte názov a umiestnenie nového projektu.
  6. Kliknite na tlačidlo Vytvoriť.

Týmto sa vytvorí nový projekt konzolovej aplikácie .NET Core v Visual Studio 2019. Tento projekt použijeme na ilustráciu nemennosti v ďalších častiach tohto článku.

Nainštalujte si balík System.Collection.Immutable NuGet

Ak chcete pracovať s nemennými typmi, mali by ste si nainštalovať balík System.Collections.Immutable z NuGet. Môžete to urobiť buď prostredníctvom správcu balíkov NuGet vo vnútri Visual Studio 2019 IDE, alebo vykonaním nasledujúceho príkazu v konzole správcu balíkov NuGet:

Install-Package System.Collections.Imutable

Tento balík obsahuje kolekciu tried bezpečných pre vlákna, známych aj ako nemenné kolekcie.

Pochopte nemennosť a záznamy v C # 9

Objekt prenosu dát je klasickým príkladom toho, kedy chcete nemennosť. Inštancia DTO je často serializovaná, aby mohla byť nezávislá od technológie použitej na strane spotrebiteľa. Prirodzene, pri prenose dátového objektu medzi databázou a klientom by ste sa chceli uistiť, že objekt nemožno zmeniť - a to je presne účel DTO. Viac informácií o používaní objektov na prenos dát v jazyku C # si môžete prečítať v mojom staršom článku tu.

Ak chcete vytvoriť nemenné DTO, môžete využiť výhody ReadOnlyCollection alebo nemenných typov kolekcií bezpečných pre vlákna v mennom priestore System.Collections.Immutable. Prípadne môžete využiť výhody typov záznamov v C # 9 na implementáciu nemenných DTO.

Typ záznamu v C # 9 je ľahký, nemenný údajový typ (alebo ľahká trieda), ktorý má iba vlastnosti iba na čítanie. Pretože je typ záznamu nemenný, je bezpečný pre vlákna a po vytvorení nemôže mutovať ani meniť.

Typ záznamu môžete inicializovať iba vo vnútri konštruktora. Vytvorenie typu záznamu pre triedu (v tomto príklade autorom) je také jednoduché ako nasledujúci úryvok kódu.

údaje o triede Autor (int Id, string firstName, string lastName, string address);

Môžete tiež napísať typ záznamu Autor, ako je uvedené v útržku kódu uvedenom nižšie:

verejná dátová trieda Autor {

public int Id {get; init; }

verejný reťazec firstName {get; init; }

verejný reťazec priezvisko {get; init; }

verejná adresa reťazca {get; init; }

}

Pri deklarovaní typu záznamu si všimnite použitie kľúčového slova data. Kľúčové slovo data, keď sa použije v deklarácii triedy, označí typ ako záznam. Môžete využiť inštanciu typu záznamu na prenos údajov cez vrstvy a súčasne na zabezpečenie nemennosti DTO.

The System.Collections.Immutable namespace

Nezmeniteľné zbierky sú tie, ktorých členovia sa už po vytvorení nemôžu meniť. Obor názvov System.Collections.Immutable obsahuje niekoľko nemenných zbierok. Tento priestor názvov obsahuje nemenné verzie zoznamov, slovníkov, polí, hashov, stohov a front.

ImmutableStack možno použiť na tlačenie a vyskakovanie prvkov rovnakým spôsobom, ako to robíme pri premenlivých komínoch. Pretože je však ImmutableStack nemenná kolekcia, jej prvky nemožno meniť. Keď teda zavoláte popovú metódu na vybratie prvku zo zásobníka, vytvorí sa pre vás nový zásobník a pôvodný zásobník zostane nezmenený.

Ukážme si to na príklade. Nasledujúci úryvok kódu ukazuje, ako môžete prvky tlačiť do nemenného zásobníka.

var stack = ImmutableStack.Empty;

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

{

stack = stack.Push (i);

}

Nasledujúci program demonštruje, že prvky nemenného stohu nemožno zmeniť.

triedny program

    {      

static void Main (reťazec [] args)

        {

var stack = ImmutableStack.Empty;

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

            {

stack = stack.Push (i);

            }

Console.WriteLine ("Počet prvkov v pôvodnom zásobníku:

"+ stack.Count ());

var newStack = stack.Pop ();

Console.WriteLine ("Počet prvkov v novom zásobníku:" +

newStack.Count ());

Console.ReadKey ();

        }

    }

Keď spustíte vyššie uvedený program, výstup by sa mal zobraziť v okne konzoly.

Ako môžete vidieť na obrázku 1, pôvodný nemenný zásobník (obsahujúci 10 prvkov) sa po výzve metódy Pop () nezmenil. Namiesto toho sa vytvorí nový nemenný zásobník s 9 prvkami.

Nezmeniteľné zbierky neponúkajú konštruktory, ale môžete využiť statickú továrenskú metódu s názvom Vytvoriť, ako je uvedené v útržku kódu uvedenom nižšie.

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

Ak by ste chceli pridať alebo odstrániť prvok z tejto kolekcie, vytvoril by sa nový nemenný zoznam a pôvodný nemenný zoznam by zostal nezmenený.

Nezmeniteľnosť je voľbou dizajnu; to znamená, že inštanciu typu nie je možné po vytvorení zmeniť. Okrem nemenných zásobníkov a nemenných frontov sú všetky nemenné zbierky založené na stromoch AVL. Preto môžete vložiť prvky na ľubovoľné miesto v zbierke, t. J. Na začiatok, do stredu alebo na koniec, bez toho, aby ste museli kopírovať celý strom.

Ako urobiť viac v C #:

  • Ako používať dátové anotácie v C #
  • Ako pracovať s identifikátormi GUID v C # 8
  • Kedy použiť abstraktné rozhranie vs. rozhranie v C #
  • Ako pracovať s AutoMapperom v C #
  • Ako používať výrazy lambda v C #
  • Ako pracovať s delegátmi Action, Func a Predicate v C #
  • Ako pracovať s delegátmi v C #
  • Ako implementovať jednoduchý záznamník v C #
  • Ako pracovať s atribútmi v C #
  • Ako pracovať s log4net v C #
  • Ako implementovať vzor návrhu úložiska v C #
  • Ako pracovať s odrazom v C #
  • Ako pracovať so súborovým systémom v C #
  • Ako vykonať lenivú inicializáciu v C #
  • Ako pracovať s MSMQ v C #
  • Ako pracovať s metódami rozšírenia v C #
  • Ako na nás výrazy lambda v C #
  • Kedy použiť volatile kľúčové slovo v C #
  • Ako používať kľúčové slovo výťažku v C #
  • Ako implementovať polymorfizmus v C #
  • Ako zostaviť vlastný plánovač úloh v C #
  • Ako pracovať s RabbitMQ v C #
  • Ako pracovať s n-ticí v C #
  • Skúmanie virtuálnych a abstraktných metód v C #
  • Ako používať Dapper ORM v C #
  • Ako používať návrhový vzor mušej váhy v C #
$config[zx-auto] not found$config[zx-overlay] not found