Programmering

Sådan bruges uforanderlighed i C #

Uforanderlighed er et træk ved funktionelle programmeringssprog, der gør programmer nemmere at skrive, teste og vedligeholde. Uforanderlighed understøttes imidlertid ikke af mange tvingende programmeringssprog. Indtil for nylig understøttede C # ikke uforanderlig out-of-the-box.

Det ændrer sig med introduktionen af ​​poster i C # 9, som er tilgængelig til forhåndsvisning i .NET 5. Vi kan dog implementere uforanderlighed i tidligere versioner af C # ved hjælp af System.Collections.Immutable navneområdet, som er tilgængeligt som en NuGet-pakke.

Et uforanderligt objekt defineres som et objekt, der ikke kan ændres, efter det er oprettet. For mange brugssager, såsom dataoverførselsobjekter, er uforanderlighed en ønskelig funktion. Denne artikel diskuterer, hvorfor vi måske vil drage fordel af uforanderlighed, og hvordan vi kan implementere uforanderlighed i C #.

For at arbejde med kodeeksemplerne i denne artikel skal du have Visual Studio 2019 installeret i dit system. Hvis du ikke allerede har en kopi, kan du downloade Visual Studio 2019 her.

Opret et .NET Core-konsolapplikationsprojekt i Visual Studio

Lad os først oprette et .NET Core-konsolapplikationsprojekt i Visual Studio. Forudsat at Visual Studio 2019 er installeret i dit system, skal du følge nedenstående trin for at oprette et nyt .NET Core-konsolapplikationsprojekt i Visual Studio.

  1. Start Visual Studio IDE.
  2. Klik på "Opret nyt projekt."
  3. I vinduet "Opret nyt projekt" skal du vælge "Konsolapp (.NET Core)" fra listen over skabeloner, der vises.
  4. Klik på Næste.
  5. I vinduet "Konfigurer dit nye projekt", der vises nedenfor, skal du angive navnet og placeringen for det nye projekt.
  6. Klik på Opret.

Dette opretter et nyt .NET Core-konsolapplikationsprojekt i Visual Studio 2019. Vi bruger dette projekt til at illustrere uforanderlighed i de efterfølgende afsnit i denne artikel.

Installer System.Collection.Immutable NuGet-pakken

For at arbejde med uforanderlige typer skal du installere pakken System.Collections.Immutable fra NuGet. Du kan gøre dette enten via NuGet pakkehåndtering inde i Visual Studio 2019 IDE eller ved at udføre følgende kommando i NuGet pakkehåndteringskonsol:

Installationspakkesystem. Samlinger. Uformelt

Denne pakke indeholder en samling af trådsikre klasser, også kendt som uforanderlige samlinger.

Forstå uforanderlighed og optegnelser i C # 9

Et dataoverførselsobjekt er et klassisk eksempel på, når du ønsker uforanderlighed. En forekomst af en DTO serieres ofte, så den kan være uafhængig af den teknologi, der anvendes i forbrugerens ende. Når du overfører et dataobjekt mellem en database og en klient, vil du naturligvis sikre, at objektet ikke kan ændres - og det er netop formålet med en DTO. Du kan læse mere om brugen af ​​dataoverførselsobjekter i C # fra min tidligere artikel her.

For at oprette uforanderlige DTO'er kan du drage fordel af en ReadOnlyCollection eller de trådsikre uforanderlige samlingstyper i System.Collections.Immutable namespace. Alternativt kan du drage fordel af pladetyper i C # 9 til at implementere uforanderlige DTO'er.

En posttype i C # 9 er en let, uforanderlig datatype (eller en letvægtsklasse), der kun har skrivebeskyttede egenskaber. Da en posttype er uforanderlig, er den trådsikker og kan ikke muteres eller ændres, efter den er oprettet.

Du kan kun initialisere en posttype inde i en konstruktør. Oprettelse af en posttype til en klasse (forfatter i dette eksempel) er så simpelt som følgende kodestykke.

klasse data Forfatter (int Id, streng fornavn, streng efternavn, streng adresse);

Du kan også skrive forfatteroptagelsestypen som vist i kodestykket nedenfor:

offentlig dataklasse Forfatter {

public int Id {get; i det; }

public string firstName {get; i det; }

offentlig streng efternavn {get; i det; }

offentlig strengadresse {get; i det; }

}

Bemærk brugen af ​​datanøgleordet, når du erklærer posttypen. Datanøgleordet, når det bruges i erklæringen om en klasse, markerer typen som en post. Du kan drage fordel af en forekomst af posttype til at videregive data på tværs af lagene og samtidig sikre uforanderlighed af DTO'erne.

System.Collections.Immutable namespace

Uforanderlige samlinger er dem, hvis medlemmer ikke kan ændre sig, når de først er oprettet. System.Collections.Immutable navneområdet består af flere uforanderlige samlinger. Dette navneområde indeholder uforanderlige versioner af lister, ordbøger, arrays, bindestreger, stakke og køer.

ImmutableStack kan bruges til at skubbe og pope elementer på samme måde som vi gør med mutable stakke. Da ImmutableStack er en uforanderlig samling, kan dens elementer imidlertid ikke ændres. Så når du ringer til popmetoden for at pope et element fra stakken, oprettes der en ny stak til dig, og den oprindelige stak forbliver uændret.

Lad os illustrere dette med et eksempel. Følgende kodestykke viser, hvordan du kan skubbe elementer til en uforanderlig stak.

var stack = ImmutableStack.Empty;

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

{

stack = stack.Push (i);

}

Det følgende program viser, at elementerne i en uforanderlig stak ikke kan ændres.

klasse Program

    {      

statisk ugyldigt Main (streng [] args)

        {

var stack = ImmutableStack.Empty;

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

            {

stack = stack.Push (i);

            }

Console.WriteLine ("Antal elementer i originalstakken:

"+ stack.Count ());

var newStack = stack.Pop ();

Console.WriteLine ("Antal elementer i ny stak:" +

newStack.Count ());

Console.ReadKey ();

        }

    }

Når du udfører ovenstående program, skal du her se, hvordan output skal vises i konsolvinduet.

Som du kan se i figur 1, er den oprindelige uforanderlige stak (indeholdende 10 elementer) uændret efter et opkald til Pop () -metoden. Snarere oprettes en ny uforanderlig stak med 9 elementer.

Uforanderlige samlinger tilbyder ikke konstruktører, men du kan drage fordel af den statiske fabriksmetode kaldet Opret som vist i kodestykket nedenfor.

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

Hvis du vil tilføje eller fjerne et element fra denne samling, oprettes en ny uforanderlig liste, og den oprindelige uforanderlige liste forbliver uændret.

Uforanderlighed er et designvalg; det betyder, at en forekomst af en type ikke kan ændres, efter at den er oprettet. Bortset fra uforanderlige stakke og uforanderlige køer er alle uforanderlige samlinger baseret på AVL-træer. Derfor kan du indsætte elementer i enhver position i samlingen, dvs. begyndelsen, midten eller slutningen uden at skulle kopiere træet i sin helhed.

Sådan gør du mere i C #:

  • Sådan bruges datanoteringer i C #
  • Sådan arbejder du med GUID'er i C # 8
  • Hvornår skal man bruge en abstrakt klasse vs. interface i C #
  • Sådan arbejder du med AutoMapper i C #
  • Sådan bruges lambda-udtryk i C #
  • Sådan arbejder du med Action-, Func- og Predicate-delegerede i C #
  • Sådan arbejder du med delegerede i C #
  • Sådan implementeres en simpel logger i C #
  • Sådan arbejder du med attributter i C #
  • Sådan arbejder du med log4net i C #
  • Sådan implementeres depotdesignmønsteret i C #
  • Sådan arbejder du med refleksion i C #
  • Sådan arbejder du med filsystemwatcher i C #
  • Sådan udføres doven initialisering i C #
  • Sådan arbejder du med MSMQ i C #
  • Sådan arbejder du med udvidelsesmetoder i C #
  • Hvordan vi lambda-udtryk i C #
  • Hvornår skal du bruge det flygtige nøgleord i C #
  • Sådan bruges afkastnøgleordet i C #
  • Sådan implementeres polymorfisme i C #
  • Sådan bygger du din egen opgaveplanlægning i C #
  • Sådan arbejder du med RabbitMQ i C #
  • Sådan arbejder du med en tuple i C #
  • Udforskning af virtuelle og abstrakte metoder i C #
  • Sådan bruges Dapper ORM i C #
  • Sådan bruges designmønsteret med flyvægt i C #
$config[zx-auto] not found$config[zx-overlay] not found