C# Academy · Oppitunti

with-lausekkeet record-tyypeissä

Luokaa muuttumattomista olioista muokattuja kopioita.

Oppitunti 4/413 vaihetta

with-lausekkeet record-tyypeissä on ilmainen C# Academy-oppitunti CoddyKitissä. Tämä on oppitunti 4/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu C# Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. C# Academy-kurssilla on yhteensä 4 oppituntia.

with-lauseke

with-lauseke luo tietueesta kopion, jossa joidenkin ominaisuuksien arvoja on muutettu, ja jättää alkuperäisen koskemattomaksi. Se on idiomaattinen tapa "päivittää" muuttumattomia tietueita.

using System;

record Point(int X, int Y);

var a = new Point(1, 2);
var b = a with { Y = 9 };
Console.WriteLine(a + " | " + b); // Point { X = 1, Y = 2 } | Point { X = 1, Y = 9 }

Tuhoamaton muutos

Alkuperäistä tietuetta ei koskaan muuteta. with tekee pinnallisen kopion ja kohdistaa luetellut muutokset vain kopioon.

using System;

record User(string Name, int Age);

var original = new User("Ada", 30);
var older = original with { Age = 31 };
Console.WriteLine(original.Age + " " + older.Age); // 30 31

Useiden ominaisuuksien muuttaminen

Luettele aaltosulkeiden sisällä useita sijoituksia, jos haluat muuttaa samanaikaisesti useampaa kuin yhtä ominaisuutta.

using System;

record Config(string Env, int Retries, bool Verbose);

var baseCfg = new Config("dev", 3, false);
var prod = baseCfg with { Env = "prod", Verbose = true };
Console.WriteLine(prod.Env + " " + prod.Retries + " " + prod.Verbose); // prod 3 True

Muuttumattomien ominaisuuksien kopiointi

Ominaisuudet, joita ette mainitse, kopioidaan sellaisinaan lähdetietueesta.

using System;

record Product(string Name, decimal Price, int Stock);

var p = new Product("Book", 12m, 5);
var discounted = p with { Price = 10m };
Console.WriteLine(discounted.Name + " " + discounted.Stock); // Book 5

with ja arvovertailu

Koska tietueissa käytetään arvovertailua, kopio, jossa ei muuteta mitään, on yhtä suuri kuin alkuperäinen.

using System;

record Coord(int X, int Y);

var a = new Coord(1, 2);
var b = a with { };
Console.WriteLine(a == b);         // True (value equal)
Console.WriteLine(ReferenceEquals(a, b)); // False (different objects)

Pintakopion semantiikka

with kopioi viitteet, ei kokonaisia syviä oliograafeja. Sisäkkäinen muutettava olio jaetaan alkuperäisen ja kopion kesken.

using System;
using System.Collections.Generic;

record Cart(List<string> Items);

var a = new Cart(new List<string> { "x" });
var b = a with { };
b.Items.Add("y"); // shared list!
Console.WriteLine(a.Items.Count); // 2

with record struct -tyypeissä

Myös record struct -tyypit tukevat with-lauseketta, joka tuottaa muokatun kopion arvotyypistä.

using System;

record struct Size(int W, int H);

var s = new Size(4, 4);
var wide = s with { W = 8 };
Console.WriteLine(wide.W + "x" + wide.H); // 8x4

with-lausekkeiden ketjuttaminen

Voitte ketjuttaa with-lausekkeita ja tehdä muutoksia peräkkäin niin, että jokainen vaihe tuottaa uuden tietueen.

using System;

record Point(int X, int Y, int Z);

var p = new Point(0, 0, 0)
    with { X = 1 }
    with { Y = 2 }
    with { Z = 3 };
Console.WriteLine(p); // Point { X = 1, Y = 2, Z = 3 }

Päivitykset ilman builder-luokkia

with poistaa builder-luokkien tarpeen: kopioikaa tietue ja muokatkaa vain haluamianne kenttiä.

using System;

record Email(string To, string Subject, string Body);

var draft = new Email("a@b.com", "Hi", "");
var ready = draft with { Body = "Welcome!" };
Console.WriteLine(ready.Body); // Welcome!

Mukautettu kopiointilogiikka

Tietueet luovat suojatun kopiorakentajan, jota with käyttää. Voitte määrittää oman kopiorakentajan ja mukauttaa kopioiden muodostamista.

using System;

record Audited(string Name) {
    public int Version { get; init; } = 1;
    protected Audited(Audited other) {
        Name = other.Name;
        Version = other.Version + 1; // bump on every copy
    }
}

var a = new Audited("x");
var b = a with { };
Console.WriteLine(a.Version + " " + b.Version); // 1 2

Yhdistetään kaikki

Tilan siirtymien mallintaminen with-lausekkeilla säilyttää muutokset kestävänä ja auditointiin sopivana historiana.

using System;

record Order(string Id, string Status);

var created = new Order("O1", "Created");
var paid = created with { Status = "Paid" };
var shipped = paid with { Status = "Shipped" };
Console.WriteLine(created.Status + " -> " + paid.Status + " -> " + shipped.Status);

Pikatesti

Testatkaa, miten hyvin ymmärrätte with-lausekkeet.

Kertaus

Opitte käyttämään tietueiden with-lausekkeita.

  • a with { Prop = value } kopioi valitut ominaisuudet ja muuttaa niitä.
  • Alkuperäistä ei koskaan muuteta, joten toiminto on tuhoamaton.
  • Kopio on pintakopio, joten sisäkkäiset muutettavat oliot jaetaan.
  • Se toimii tietueissa ja record struct -tyypeissä, ja lausekkeita voi ketjuttaa.
Aloita maksutta

Opi C# tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
93
Oppitunnit
346

Usein kysytyt kysymykset

Onko oppitunti ”with-lausekkeet record-tyypeissä” ilmainen?

Kyllä – oppitunnin ”with-lausekkeet record-tyypeissä” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko C# Academy-kurssin, päivitä CoddyKit PROhon. C# Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”with-lausekkeet record-tyypeissä”?

Luokaa muuttumattomista olioista muokattuja kopioita. Harjoittelet C# Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni C# Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin C# Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 4/4.

Kuinka kauan ”with-lausekkeet record-tyypeissä”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä C# Academy-oppitunnilla?

Kyllä. Jokainen C# Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. init-vain-asettajat
  2. required-määrite
  3. Muuttumattomien olioiden mallit
  4. with-lausekkeet record-tyypeissä
← Takaisin: C# Academy