C# Academy · Lektion

Mønstre for uforanderlige objekter

Design objekter, der aldrig ændres efter oprettelsen.

Lektion 3 af 413 trin

Mønstre for uforanderlige objekter er en gratis C# Academy-lektion på CoddyKit. Dette er lektion 3 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i C# Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. C# Academy-kurset indeholder 4 lektioner i alt.

Design af uforanderlige objekter

Et uforanderligt objekt ændrer sig aldrig efter oprettelsen. Uforanderlighed fjerner hele klasser af fejl omkring delt tilstand, der kan ændres, og gør objekter sikre at sende rundt og cache.

Egenskaber, der kun kan læses

Den enkleste uforanderlige egenskab kan kun læses og tildeles én gang fra en konstruktør.

using System;

class Point {
    public int X { get; }
    public int Y { get; }
    public Point(int x, int y) { X = x; Y = y; }
}

var p = new Point(3, 4);
Console.WriteLine(p.X + "," + p.Y); // 3,4

init til initialiseringssyntaks

Brug init-egenskaber, når du ønsker uforanderlighed kombineret med den praktiske syntaks for objektinitialiseringer.

using System;

class Color {
    public int R { get; init; }
    public int G { get; init; }
    public int B { get; init; }
}

var c = new Color { R = 255, G = 128, B = 0 };
Console.WriteLine(c.R + "," + c.G + "," + c.B); // 255,128,0

required til obligatoriske felter

Kombinér required + init, så nødvendige felter hverken kan glemmes eller ændres.

using System;

class Money {
    public required decimal Amount { get; init; }
    public required string Currency { get; init; }
}

var m = new Money { Amount = 9.99m, Currency = "USD" };
Console.WriteLine(m.Amount + " " + m.Currency); // 9.99 USD

Returnering af nye objekter i stedet for ændringer

Uforanderlige typer eksponerer ændringshandlinger som metoder, der returnerer en ny instans og lader originalen være urørt.

using System;

class Point {
    public int X { get; init; }
    public int Y { get; init; }
    public Point Move(int dx, int dy) => new Point { X = X + dx, Y = Y + dy };
}

var a = new Point { X = 1, Y = 1 };
var b = a.Move(2, 3);
Console.WriteLine(a.X + "," + a.Y + " -> " + b.X + "," + b.Y); // 1,1 -> 3,4

Uforanderlige samlinger

For samlingsfelter skal du gemme en uforanderlig eller skrivebeskyttet samling, så indholdet ikke kan ændres gennem objektet.

using System;
using System.Collections.Immutable;

class Team {
    public ImmutableList<string> Members { get; init; } = ImmutableList<string>.Empty;
}

var t = new Team { Members = ["Ada", "Lin"] };
var t2 = new Team { Members = t.Members.Add("Sam") };
Console.WriteLine(t.Members.Count + " " + t2.Members.Count); // 2 3

Defensiv kopiering

Hvis du er nødt til at modtage en samling, der kan ændres, skal du kopiere den ved modtagelsen, så eksterne ændringer ikke kan trænge igennem.

using System;
using System.Collections.Generic;
using System.Linq;

class Snapshot {
    private readonly int[] data;
    public Snapshot(IEnumerable<int> source) => data = source.ToArray();
    public IReadOnlyList<int> Data => data;
}

var list = new List<int> { 1, 2, 3 };
var snap = new Snapshot(list);
list.Add(4); // does not affect snap
Console.WriteLine(snap.Data.Count); // 3

Værdibaseret lighed

Uforanderlige objekter har ofte brug for værdibaseret lighed: To instanser med de samme data betragtes som ens. Records giver dette automatisk; klasser kræver tilsidesættelser.

using System;

record Coord(int X, int Y);

Console.WriteLine(new Coord(1, 2) == new Coord(1, 2)); // True

Trådsikkerhed uden ekstra arbejde

Fordi uforanderlige objekter aldrig ændrer sig, er de i sagens natur trådsikre at dele uden låse.

using System;

class ReadonlyConfig {
    public required string Env { get; init; }
}

var cfg = new ReadonlyConfig { Env = "prod" };
// safe to read from many threads without synchronization
Console.WriteLine(cfg.Env); // prod

readonly-felter og structs

Brug readonly-felter og readonly struct til at håndhæve uforanderlighed for værdityper på feltniveau.

using System;

readonly struct Vector {
    public readonly double X, Y;
    public Vector(double x, double y) { X = x; Y = y; }
    public double Length => Math.Sqrt(X * X + Y * Y);
}

Console.WriteLine(new Vector(3, 4).Length); // 5

Sæt det hele sammen

En fuldstændig uforanderlig type, der kombinerer required, init, værdibaseret lighed og en opdateringsmetode, der ikke ændrer objektet.

using System;

record Account(string Id, decimal Balance) {
    public Account Deposit(decimal amount) => this with { Balance = Balance + amount };
}

var a = new Account("A1", 100m);
var b = a.Deposit(50m);
Console.WriteLine(a.Balance + " -> " + b.Balance); // 100 -> 150

Hurtigt tjek

Bekræft princippet om uforanderlige opdateringer.

Opsamling

Du har lært mønstre til uforanderlige objekter.

  • Brug egenskaber, der kun kan læses, eller init-egenskaber, samt required til obligatoriske data.
  • Modellér ændringer som metoder, der returnerer nye instanser.
  • Gem uforanderlige samlinger eller samlinger, der er kopieret defensivt.
  • Records giver værdibaseret lighed og with-kopier; uforanderlighed giver trådsikkerhed.
Gratis at komme i gang

Lær C# med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
93
Lektioner
346

Ofte stillede spørgsmål

Er lektionen “Mønstre for uforanderlige objekter” gratis?

Ja — hele teksten til “Mønstre for uforanderlige objekter” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af C# Academy-kurset, skal du opgradere til CoddyKit PRO. C# Academy-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “Mønstre for uforanderlige objekter”?

Design objekter, der aldrig ændres efter oprettelsen. Du øver dig i C# Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på C# Academy?

Der kræves ingen tidligere erfaring. C# Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 3 af 4.

Hvor lang tid tager lektionen “Mønstre for uforanderlige objekter”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne C# Academy-lektion?

Ja. Alle C# Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. init-only-settere
  2. Modifikatoren required
  3. Mønstre for uforanderlige objekter
  4. with-udtryk på records
← Tilbage til C# Academy