C# Academy · Oppitunti

Tyyppi- ja ominaisuusmallit

Täsmäyttäkää rakenteen ja jäsenten perusteella.

Oppitunti 2/413 vaihetta

Tyyppi- ja ominaisuusmallit on ilmainen C# Academy-oppitunti CoddyKitissä. Tämä on oppitunti 2/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.

Tyyppikuvio

Tyyppikuvio täsmää, kun syöte on tietyn tyypin ilmentymä. Kun switch-haaraan kirjoitetaan pelkkä tyypin nimi, se testaa arvon ajonaikaisen tyypin.

Tämä korvaa kömpelöt is-tarkistusten ja tyyppimuunnosten ketjut selkeällä yhden lausekkeen tarkistuksella, joka myös tarkentaa tyypin automaattisesti.

object o = "hello";
string kind = o switch
{
    int    => "number",
    string => "text",
    _      => "unknown"
};
System.Console.WriteLine(kind);

Esittelykuviot

Esittelykuviossa tyypin perään lisätään muuttujan nimi: string s. Kun kuvio täsmää, syöte muunnetaan kyseiseen tyyppiin ja sidotaan muuttujaan.

Tämän jälkeen voitte käyttää tyypitettyä muuttujaa haaran oikealla puolella ja käsitellä kyseiselle tyypille ominaisia jäseniä ilman erillistä tyyppimuunnosta.

object o = "coddy";
string result = o switch
{
    string s => $"len {s.Length}",
    int n    => $"value {n}",
    _        => "other"
};
System.Console.WriteLine(result);

Toimiva tyyppien mukaan vaihtaminen

Tyyppikuviot sopivat erinomaisesti heterogeenisen datan käsittelyyn, esimerkiksi arvojen jäsentämiseen object-taulukosta.

Tässä jokainen alkio tunnistetaan ajonaikaisen tyyppinsä perusteella ja muotoillaan sen mukaisesti. Sidottu muuttuja kuljettaa tarkennetun tyypin tuloslausekkeeseen.

using System;

class Program {
    static string Describe(object o) => o switch {
        int i    => $"int {i}",
        double d => $"double {d}",
        string s => $"string '{s}'",
        _        => "?"
    };
    static void Main() {
        foreach (var x in new object[]{ 1, 2.5, "hi" })
            Console.WriteLine(Describe(x));
    }
}

Ominaisuuskuvio

Ominaisuuskuvio tutkii olion jäseniä aaltosulkeiden avulla: { Property: value }. Se täsmää, kun jokainen lueteltu ominaisuus täyttää sisäkkäisen kuvionsa ehdot.

Näin voitte haarautua suoraan olion rakenteen ja sisällön perusteella ilman manuaalisia jäsenvertailuja.

record Person(string Name, int Age);

var p = new Person("Ada", 30);
string stage = p switch
{
    { Age: < 18 } => "minor",
    { Age: >= 65 } => "senior",
    _ => "adult"
};
System.Console.WriteLine(stage);

Useita ominaisuuksia

Voitte testata useita ominaisuuksia kerralla erottamalla ne pilkuilla aaltosulkeiden sisällä. Kaikkien on täsmättävä, jotta haara suoritetaan.

Tämä ilmaisee yhdistelmäehdot selkeästi, esimerkiksi kun haetaan oliota, jolla on sekä tietty tila että tietty määrä.

record Order(string Status, int Items);

var order = new Order("Open", 0);
string msg = order switch
{
    { Status: "Open", Items: 0 } => "empty cart",
    { Status: "Open" } => "shopping",
    _ => "closed"
};
System.Console.WriteLine(msg);

Tyypin ja ominaisuuden yhdistäminen

Tyyppi- ja ominaisuuskuvioita voi yhdistää: kirjoittakaa ensin tyyppi ja sen jälkeen ominaisuudet sisältävä aaltosulkelohko. Haara täsmää vain, jos syöte on kyseistä tyyppiä ja sen ominaisuudet täsmäävät.

Tämä on tehokasta käsiteltäessä perusluokkaviitteitä tai rajapintoja, kun haluatte haarautua samanaikaisesti konkreettisten alatyyppien ja niiden tilan perusteella.

using System;

abstract record Shape;
record Circle(double R) : Shape;
record Square(double Side) : Shape;

class Program {
    static string Big(Shape s) => s switch {
        Circle { R: > 10 } => "big circle",
        Square { Side: > 10 } => "big square",
        _ => "small"
    };
    static void Main() => Console.WriteLine(Big(new Circle(12)));
}

Sisäkkäiset ominaisuuskuviot

Ominaisuuskuvioita voi sijoittaa sisäkkäin. Jos ominaisuus on itse olio, voitte täsmäyttää sen jäsenet toisella aaltosulkelohkolla.

Esimerkiksi { Address: { City: "Paris" } } etenee kahden tason syvyyteen yhdessä lausekkeessa. Näin vältetään null-arvoille alttiit pisteillä yhdistetyt käyttöketjut.

record Address(string City);
record User(string Name, Address Address);

var u = new User("Lin", new Address("Paris"));
bool inParis = u is { Address: { City: "Paris" } };
System.Console.WriteLine(inParis);

Laajennettu ominaisuuksien käyttö

C# 10:stä alkaen ominaisuuskuviossa voi käyttää pisteillä eroteltua polkua: { Address.City: "Paris" }. Se on lyhyt muoto sisäkkäisille aaltosulkeille.

Tämä litistää syvät tarkistukset yhdeksi luettavaksi riviksi ja käsittelee silti väliin jäävät arvot turvallisesti osuman aikana.

record Address(string City);
record User(string Name, Address Address);

var u = new User("Lin", new Address("Rome"));
string where = u switch
{
    { Address.City: "Paris" } => "FR",
    { Address.City: "Rome" }  => "IT",
    _ => "??"
};
System.Console.WriteLine(where);

Koko osuman sitominen

Voitte sitoa muuttujan koko täsmänneeseen arvoon lisäämällä nimen ominaisuuskuvion perään: { Age: > 18 } adult.

Muuttuja adult viittaa silloin koko olioon haaran sisällä, joten voitte käyttää sitä sen jälkeen, kun sen ominaisuudet on todettu vaatimusten mukaisiksi.

using System;

record Person(string Name, int Age);

class Program {
    static void Main() {
        Person p = new("Sam", 40);
        string r = p switch {
            { Age: >= 18 } adult => $"{adult.Name} can vote",
            _ => "too young"
        };
        Console.WriteLine(r);
    }
}

Null-arvojen käsittely

Ominaisuuskuvio ei koskaan täsmää arvoon null, koska tutkittavaa oliota ei ole. Siksi { } eli tyhjät aaltosulkeet täsmäävät mihin tahansa ei-null-arvoon.

Tämän vuoksi not null ja { } ovat hyödyllisiä tapoja tarkistaa null-arvot, ja ominaisuuksiin perustuvat haarat ohittavat null-syötteet turvallisesti.

string? maybe = null;
string state = maybe switch
{
    null => "missing",
    { Length: 0 } => "empty",
    _ => "has text"
};
System.Console.WriteLine(state);

Miksi kuviot ovat tyyppimuunnoksia parempia

Ennen kuvioita tyyppiin perustuva haarautuminen tarkoitti is-tarkistuksia, niitä seuraavia tyyppimuunnoksia ja null-tarkistuksia. Tyyppi- ja ominaisuuskuviot kokoavat kaiken tämän yhdeksi lausekkeeksi.

Kääntäjä seuraa lisäksi kattavuutta ja saavutettavuutta sekä havaitsee käyttämättömät haarat ja puuttuvat tapaukset, jotka käsin kirjoitetut if-ketjut jättäisivät huomaamatta.

object o = 42;
// Old: if (o is int) { int n = (int)o; ... }
// New:
if (o is int n) System.Console.WriteLine(n + 1);

Pikatarkistus

Testatkaa, kuinka hyvin ymmärrätte tyyppi- ja ominaisuuskuvioita.

Kertaus

Tyyppikuviot täsmäävät ajonaikaisen tyypin perusteella ja voivat sitoa tyypitetyn muuttujan. Ominaisuuskuviot tutkivat jäseniä muodossa { Prop: pattern }, tukevat sisäkkäisyyttä ja pisteillä eroteltuja polkuja eivätkä koskaan täsmää null-arvoon.

Yhdistämällä ne voitte haarautua sekä rakenteen että tilan perusteella. Seuraavaksi käsittelemme vertailu- ja loogisia kuvioita.

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 ”Tyyppi- ja ominaisuusmallit” ilmainen?

Kyllä – oppitunnin ”Tyyppi- ja ominaisuusmallit” 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 ”Tyyppi- ja ominaisuusmallit”?

Täsmäyttäkää rakenteen ja jäsenten perusteella. 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 2/4.

Kuinka kauan ”Tyyppi- ja ominaisuusmallit”-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. switch-lausekkeet
  2. Tyyppi- ja ominaisuusmallit
  3. Relaatio- ja logiikkamallit
  4. Lista- ja tuple-mallit
← Takaisin: C# Academy