Programmering

Hvordan bruke uforanderlighet i C #

Uforanderlighet er en funksjon av funksjonelle programmeringsspråk som gjør det lettere å skrive, teste og vedlikeholde programmer. Imotabilitet støttes imidlertid ikke av mange tvingende programmeringsspråk. Inntil nylig støttet ikke C # immutability out-of-the-box.

Det endres med introduksjonen av poster i C # 9, som er tilgjengelig for forhåndsvisning i .NET 5. Vi kan imidlertid implementere uforanderlighet i tidligere versjoner av C # ved å bruke System.Collections.Immutable namespace, som er tilgjengelig som en NuGet-pakke.

Et uforanderlig objekt er definert som et objekt som ikke kan endres etter at det er opprettet. For mange bruksområder, for eksempel dataoverføringsobjekter, er uforanderlighet en ønskelig funksjon. Denne artikkelen diskuterer hvorfor vi kanskje vil dra nytte av uforanderlighet og hvordan vi kan implementere uforanderlighet i C #.

For å jobbe med kodeeksemplene som er gitt i denne artikkelen, bør du ha Visual Studio 2019 installert på systemet ditt. Hvis du ikke allerede har en kopi, kan du laste ned Visual Studio 2019 her.

Opprett et .NET Core-konsollapplikasjonsprosjekt i Visual Studio

La oss først lage et .NET Core-konsollapplikasjonsprosjekt i Visual Studio. Forutsatt at Visual Studio 2019 er installert i systemet ditt, følger du trinnene som er beskrevet nedenfor for å opprette et nytt .NET Core-konsollapplikasjonsprosjekt i Visual Studio.

  1. Start Visual Studio IDE.
  2. Klikk på "Opprett nytt prosjekt."
  3. I vinduet "Opprett nytt prosjekt" velger du "Konsollapp (.NET Core)" fra listen over maler som vises.
  4. Klikk på Neste.
  5. I vinduet “Konfigurer ditt nye prosjekt” som vises, angir du navnet og stedet for det nye prosjektet.
  6. Klikk på Opprett.

Dette vil opprette et nytt .NET Core-konsollapplikasjonsprosjekt i Visual Studio 2019. Vi bruker dette prosjektet for å illustrere uforanderlighet i de påfølgende delene av denne artikkelen.

Installer System.Collection.Immuterbar NuGet-pakke

For å jobbe med uforanderlige typer, bør du installere pakken System.Collections.Immutable fra NuGet. Du kan gjøre dette enten via NuGet pakkebehandling i Visual Studio 2019 IDE, eller ved å utføre følgende kommando i NuGet pakkebehandler-konsoll:

Install-Package System.Collections.Immutable

Denne pakken består av en samling trådsikre klasser, også kjent som uforanderlige samlinger.

Forstå uforanderlighet og poster i C # 9

Et dataoverføringsobjekt er et klassisk eksempel på når du ønsker uforanderlighet. En forekomst av en DTO serialiseres ofte slik at den kan være uavhengig av teknologien som brukes i forbrukerens slutt. Når du overfører et dataobjekt mellom en database og en klient, vil du naturligvis sørge for at objektet ikke kan endres - og det er akkurat formålet med en DTO. Du kan lese mer om bruken av dataoverføringsobjekter i C # fra min tidligere artikkel her.

For å lage uforanderlige DTO-er, kan du dra nytte av en ReadOnlyCollection eller trådsikre uforanderlige samlingstyper i System.Collections.Immutable namespace. Alternativt kan du dra nytte av platetyper i C # 9 for å implementere uforanderlige DTO-er.

En posttype i C # 9 er en lett, uforanderlig datatype (eller en lett klasse) som bare har skrivebeskyttede egenskaper. Siden en platetype er uforanderlig, er den trådsikker og kan ikke mutere eller endre etter at den er opprettet.

Du kan initialisere en platetype bare inne i en konstruktør. Å lage en posttype for en klasse (forfatter i dette eksemplet) er like enkelt som følgende kodebit.

klassedata Forfatter (int Id, streng fornavn, streng etternavn, streng adresse);

Du kan også skrive forfatterens oppføringstype som vist i kodebiten gitt nedenfor:

offentlig dataklasse Forfatter {

offentlig int Id {get; i det; }

offentlig streng fornavn {get; i det; }

offentlig streng etternavn {get; i det; }

offentlig strengadresse {get; i det; }

}

Legg merke til bruken av datasøkeordet når du erklærer posttypen. Datanøkkelordet når det brukes i erklæringen til en klasse, markerer typen som en post. Du kan dra nytte av en forekomst av posttype for å overføre data over lagene samtidig som du sikrer uforanderlighet av DTO-ene.

System.Collections.Immuterbart navneområde

Uforanderlige samlinger er de hvis medlemmer ikke kan endres når de er opprettet. System.Collections.Immutable namespace består av flere uforanderlige samlinger. Dette navneområdet inneholder uforanderlige versjoner av lister, ordbøker, matriser, bindestreker, stabler og køer.

ImmutableStack kan brukes til å skyve og pope elementer på samme måte som vi gjør med mutable stabler. Imidlertid, siden ImmutableStack er en uforanderlig samling, kan ikke elementene endres. Så når du ringer til popmetoden for å poppe et element fra stakken, opprettes en ny stabel for deg, og den originale stakken forblir uendret.

La oss illustrere dette med et eksempel. Følgende kodebit viser hvordan du kan skyve elementer på en uforanderlig stabel.

var stack = ImmutableStack.Empty;

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

{

stack = stack.Push (i);

}

Følgende program viser at elementene i en uforanderlig stabel ikke kan endres.

klasse Program

    {      

statisk tomrom Main (streng [] args)

        {

var stack = ImmutableStack.Empty;

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

            {

stack = stack.Push (i);

            }

Console.WriteLine ("Antall elementer i originalstakken:

"+ stack.Count ());

var newStack = stack.Pop ();

Console.WriteLine ("Antall elementer i ny stabel:" +

newStack.Count ());

Console.ReadKey ();

        }

    }

Når du kjører programmet ovenfor, kan du se hvordan utdataene skal vises i konsollvinduet.

Som du kan se i figur 1, er den originale uforanderlige stakken (som inneholder 10 elementer) uendret etter et kall til Pop () -metoden. Snarere opprettes en ny uforanderlig stabel med 9 elementer.

Uforanderlige samlinger tilbyr ikke konstruktører, men du kan dra nytte av den statiske fabrikkmetoden kalt Create som vist i kodebiten gitt nedenfor.

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

Hvis du vil legge til eller fjerne et element fra denne samlingen, vil en ny uforanderlig liste opprettes og den opprinnelige uforanderlige listen forblir uendret.

Uforanderlighet er et designvalg; det betyr at en forekomst av en type ikke kan endres etter at den er opprettet. Med unntak av uforanderlige stabler og uforanderlige køer, er alle uforanderlige samlinger basert på AVL-trær. Derfor kan du sette inn elementer når som helst i samlingen, dvs. begynnelsen, midten eller slutten, uten å måtte kopiere treet i sin helhet.

Hvordan gjøre mer i C #:

  • Slik bruker du datanoteringer i C #
  • Hvordan jobbe med GUIDer i C # 8
  • Når skal jeg bruke en abstrakt klasse vs. grensesnitt i C #
  • Hvordan jobbe med AutoMapper i C #
  • Hvordan bruke lambdauttrykk i C #
  • Hvordan jobbe med Action-, Func- og Predicate-delegater i C #
  • Hvordan jobbe med delegater i C #
  • Slik implementerer du en enkel logger i C #
  • Hvordan jobbe med attributter i C #
  • Hvordan jobbe med log4net i C #
  • Slik implementerer du mønsteret for depotdesign i C #
  • Hvordan jobbe med refleksjon i C #
  • Hvordan jobbe med filsystemwatcher i C #
  • Hvordan utføre lat initialisering i C #
  • Hvordan jobbe med MSMQ i C #
  • Hvordan jobbe med utvidelsesmetoder i C #
  • Hvordan vi lambdauttrykk i C #
  • Når skal du bruke det flyktige nøkkelordet i C #
  • Slik bruker du avkastningsnøkkelordet i C #
  • Hvordan implementere polymorfisme i C #
  • Hvordan lage din egen oppgaveplanlegger i C #
  • Hvordan jobbe med RabbitMQ i C #
  • Hvordan jobbe med en tuple i C #
  • Utforske virtuelle og abstrakte metoder i C #
  • Hvordan bruke Dapper ORM i C #
  • Hvordan bruke flyvevekt mønster i C #
$config[zx-auto] not found$config[zx-overlay] not found