Programování

Jak používat neměnnost v C #

Immutability je vlastnost funkčních programovacích jazyků, která usnadňuje psaní, testování a údržbu programů. Mnoho imperativních programovacích jazyků však neměnnost nepodporuje. C # donedávna nepodporoval neměnnost ihned po vybalení.

To se změní se zavedením záznamů v C # 9, které je k dispozici pro náhled v .NET 5. Můžeme však implementovat neměnnost v dřívějších verzích C # pomocí System.Collections.Immutable oboru názvů, který je k dispozici jako balíček NuGet.

Neměnný objekt je definován jako objekt, který nelze po vytvoření změnit. Pro mnoho případů použití, například Data Transfer Objects, je neměnnost žádoucí funkcí. Tento článek pojednává o tom, proč bychom mohli chtít využít výhod neměnnosti a jak můžeme implementovat neměnnost v C #.

Chcete-li pracovat s příklady kódu uvedenými v tomto článku, měli byste mít ve svém systému nainstalovanou Visual Studio 2019. Pokud ještě nemáte kopii, můžete si stáhnout Visual Studio 2019 zde.

Vytvořte projekt aplikace konzoly .NET Core v sadě Visual Studio

Nejprve si vytvořme projekt konzolové aplikace .NET Core v sadě Visual Studio. Za předpokladu, že je ve vašem systému nainstalovaná sada Visual Studio 2019, postupujte podle níže uvedených kroků a vytvořte nový projekt konzolové aplikace .NET Core v sadě Visual Studio.

  1. Spusťte Visual Studio IDE.
  2. Klikněte na „Vytvořit nový projekt“.
  3. V okně „Vytvořit nový projekt“ vyberte ze zobrazeného seznamu šablon „Console App (.NET Core)“.
  4. Klikněte na Další.
  5. V dalším okně „Konfigurace nového projektu“ zadejte název a umístění nového projektu.
  6. Klikněte na Vytvořit.

Tím se vytvoří nový projekt aplikace konzoly .NET Core v sadě Visual Studio 2019. Tento projekt použijeme k ilustraci neměnnosti v následujících částech tohoto článku.

Nainstalujte balíček System.Collection.Immutable NuGet

Chcete-li pracovat s neměnnými typy, měli byste nainstalovat balíček System.Collections.Immutable z NuGet. Můžete to udělat buď prostřednictvím správce balíčků NuGet uvnitř IDE sady Visual Studio 2019, nebo provedením následujícího příkazu v konzole správce balíčků NuGet:

Install-Package System.Collections.Imutable

Tento balíček obsahuje kolekci tříd bezpečných pro vlákna, označovaných také jako neměnné kolekce.

Pochopte neměnnost a záznamy v C # 9

Objekt přenosu dat je klasickým příkladem toho, kdy chcete neměnnost. Instance DTO je často serializována, aby mohla být nezávislá na technologii použité na konci spotřebitele. Při přenosu datového objektu mezi databází a klientem byste přirozeně chtěli zajistit, aby objekt nemohl být změněn - a to je přesně účel DTO. Další informace o použití objektů pro přenos dat v C # si můžete přečíst z mého dřívějšího článku zde.

Chcete-li vytvořit neměnné DTO, můžete využít výhod ReadOnlyCollection nebo neměnných typů kolekcí bezpečných pro vlákna ve jmenném prostoru System.Collections.Immutable. Alternativně můžete využít výhody typů záznamů v C # 9 k implementaci neměnných DTO.

Typ záznamu v C # 9 je lehký, neměnný datový typ (nebo lehká třída), který má pouze vlastnosti jen pro čtení. Vzhledem k tomu, že typ záznamu je neměnný, je bezpečný pro vlákna a po vytvoření jej nelze mutovat ani změnit.

Typ záznamu můžete inicializovat pouze uvnitř konstruktoru. Vytvoření typu záznamu pro třídu (v tomto příkladu autor) je stejně jednoduché jako následující fragment kódu.

údaje o třídě Autor (int Id, řetězec firstName, string lastName, string address);

Můžete také napsat typ záznamu Autor, jak je ukázáno ve fragmentu kódu uvedeném níže:

veřejná datová třída Autor {

public int Id {get; init; }

veřejný řetězec firstName {get; init; }

veřejný řetězec příjmení {get; init; }

veřejná adresa řetězce {get; init; }

}

Při deklarování typu záznamu si všimněte použití datového klíčového slova. Klíčové slovo data při použití v deklaraci třídy označí typ jako záznam. Můžete využít instanci typu záznamu k předávání dat napříč vrstvami a současně zajistit neměnnost DTO.

The System.Collections.Immutable namespace

Nezměnitelné sbírky jsou ty, jejichž členové se po vytvoření nemohou změnit. Obor názvů System.Collections.Immutable obsahuje několik neměnných kolekcí. Tento obor názvů obsahuje neměnné verze seznamů, slovníků, polí, hashů, zásobníků a front.

ImmutableStack lze použít k push a pop prvky stejně jako my s proměnnými zásobníky. Protože je však ImmutableStack neměnná kolekce, nelze její prvky změnit. Když tedy zavoláte metodu pop k vyskakování prvku ze zásobníku, vytvoří se pro vás nový zásobník a původní zásobník zůstane nezměněn.

Uveďme si to na příkladu. Následující fragment kódu ukazuje, jak můžete tlačit prvky do neměnného zásobníku.

var stack = ImmutableStack.Empty;

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

{

stack = stack.Push (i);

}

Následující program ukazuje, že prvky neměnného zásobníku nelze změnit.

třídní program

    {      

static void Main (řetězec [] args)

        {

var stack = ImmutableStack.Empty;

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

            {

stack = stack.Push (i);

            }

Console.WriteLine ("Počet prvků v původním zásobníku:

"+ stack.Count ());

var newStack = stack.Pop ();

Console.WriteLine ("Počet prvků v novém zásobníku:" +

newStack.Count ());

Console.ReadKey ();

        }

    }

Když spustíte výše uvedený program, zde by se měl výstup zobrazit v okně konzoly.

Jak vidíte na obrázku 1, původní neměnný zásobník (obsahující 10 prvků) se po volání metody Pop () nezmění. Spíše je vytvořen nový neměnný zásobník s 9 prvky.

Neměnné kolekce nenabízejí konstruktory, ale můžete využít metodu statické továrny nazvanou Vytvořit, jak je ukázáno v níže uvedeném fragmentu kódu.

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

Pokud byste chtěli přidat nebo odebrat prvek z této kolekce, vytvořil by se nový nezměnitelný seznam a původní nezměnitelný seznam by zůstal nezměněn.

Nezměnitelnost je volbou designu; to znamená, že instanci typu nelze po vytvoření změnit. Kromě neměnných zásobníků a neměnných front jsou všechny neměnné kolekce založeny na stromech AVL. Proto můžete vkládat prvky na libovolné místo kolekce, tj. Na začátek, na střed nebo na konec, aniž byste museli kopírovat strom jako celek.

Jak udělat více v C #:

  • Jak používat datové anotace v C #
  • Jak pracovat s identifikátory GUID v C # 8
  • Kdy použít abstraktní třídu vs. rozhraní v C #
  • Jak pracovat s AutoMapperem v C #
  • Jak používat výrazy lambda v C #
  • Jak pracovat s delegáty Action, Func a Predicate v C #
  • Jak pracovat s delegáty v C #
  • Jak implementovat jednoduchý záznamník v C #
  • Jak pracovat s atributy v C #
  • Jak pracovat s log4net v C #
  • Jak implementovat vzor návrhu úložiště v C #
  • Jak pracovat s odrazem v C #
  • Jak pracovat se souborovým systémem v C #
  • Jak provést línou inicializaci v C #
  • Jak pracovat s MSMQ v C #
  • Jak pracovat s metodami rozšíření v C #
  • Jak na nás lambda výrazy v C #
  • Kdy použít volatilní klíčové slovo v C #
  • Jak používat klíčové slovo výnos v C #
  • Jak implementovat polymorfismus v C #
  • Jak vytvořit svůj vlastní plánovač úloh v C #
  • Jak pracovat s RabbitMQ v C #
  • Jak pracovat s n-ticí v C #
  • Zkoumání virtuálních a abstraktních metod v C #
  • Jak používat Dapper ORM v C #
  • Jak používat návrhový vzor muší váhy v C #
$config[zx-auto] not found$config[zx-overlay] not found