Dette er nytt i .NET 8: - Ganske imponerende!

– For en utvikler som i mange år har brukt Newtonsoft.Json virket System.Text.Json i mange år ganske primitivt. Dette gapet begynner nå å lukke seg, skriver Tobias Moe Thorstensen.

I denne artikkelen går Tobias Moe Thorstensen igjennom de .NET-nyhetene han synes er mest spennende. 📸: Privat
I denne artikkelen går Tobias Moe Thorstensen igjennom de .NET-nyhetene han synes er mest spennende. 📸: Privat Vis mer

Hei, det er meg igjen! Han som dukker opp rundt månedsskifte oktober/november for å fortelle deg hva som er nytt i årets utgave av .NET.

Årets utgave av .NET kalles helt enkelt for .NET 8. Forrige versjon, .NET 7, er støttet av Microsoft frem til midten av mai 2024 som Standard Term Support (STS). I motsetning til denne versjonen vil årets utgave bli utgitt som Long Term Support (LTS), og være støttet tre år frem i tid. Støttetrategien til Microsoft innebærer at alle oddetallsutgaver av .NET får Standard Term Support med gratis patcher i 18 måneder fra lanseringsdato.

Alle partallsutgaver får Long Term Support(LTS) med gratis patcher og vil være støttet i tre år.

.NET 8 har vært ute en stund i ulike Preview-utgaver, den siste Preview 7. I midten av september ble også RC1 sluppet. Det er først på dotnetconf 14. – 16. november at LTS-utgaven slippes. I denne artikkelen går jeg igjennom de nyhetene jeg synes er mest spennende.

Så, hva er egentlig nytt?

Som i tidligere artikler er det greit å rydde litt i terminologien. .NET er et rammeverk og plattform som støtter språkene C#, F# og Visual Basic.

C# er den objektorienterte, imperative varianten. Men har helt siden introduksjonen av LINQ i 2007 bevegd seg mer og mer i retning av funksjonell tankegang. Vi kaller det gjerne et hydridspråk – et språk som mikser flere paradigmer. Når .NET 8 lanseres vil samtidig C# 12 bli sluppet.

F# er det sterkt typede funksjonelle språket som kjører på .NET-platformen. Språket har sitt utspring fra Microsoft Research Cambridge, og ble introdusert på starten av 2000-tallet som en bi-effekt av arbeidet rundt å bringe generics til .NET. Dom Syme, som mange nok forbinder som skaperen av F# var sterkt bidragsytende til denne jobben. Når .NET 8 lanseres vil samtidig F# 8 bli sluppet.

Nok prat om fortiden. La oss se fremover og fokusere på et utvalg av nyheter i .NET 8

Forbedret json-serialisering

Newtonsoft.Json er et tredjepartsbibliotek de fleste C#-utviklere har et forhold til. Dette biblioteket, med 3,6 milliarder nedlastninger på NuGet.org, har i mange år vært det foretrukne biblioteket når det kommer til håndtering av json.

Da Microsoft lanserte .NET Core hadde de så smått begynt på et nytt biblioteket for å håndtere json med namespace System.Text.Json. Dette biblioteket har i all tid hatt stor fokus på ytelsesoptimaliseringer, og da spesielt med tanke på minneallokering.

For en utvikler som i mange år har brukt Newtonsoft.Json virket System.Text.Json i mange år ganske primitivt. Dette gapet begynner nå å lukke seg i .NET 8. I årets utgave er det blant annet blitt introdusert:

  • Deserialisering til typer som er readonly-properties. Altså typer uten set;. Denne funksjonaliteten har vært tilgjenglig i Newtonsoft en god stund, så det er gledelig å se at dette også støttes i System.Text.Json

  • Serialisering av interface-hierarkier. Har du en type som må implementere flere interfacer vil alle properties definert i hierarkiet bli serialisert.

  • Støtte for kebab-case og snake_case som innebygde naming policies. Hittil har bare camelCase vært støttet

Nye typer egnet for rask tilgang på data

FrozenSet<T> og FrozenDictionary<TKey, TValue> er to nye typer velegnet til bruksområder hvor det er aktuelt å aksessere data raskt mens applikasjonen din kjører. Typisk statisk data som er cachet.

Ved å benytte seg av et biblioteket kalt Benchmark.NET og sammenligne tidene det tar å sjekke om ulike liste-implementasjoner inneholder en integer, viser det seg at FrozenSet<int> i snitt bruker 5,582 mikrosekunder, kontra List<int> som klokker inn på 207,408 mikrosekunder ved å gjøre oppslag mot 2000 integers.

image: Dette er nytt i .NET 8: - Ganske imponerende!

Mean: Arithmetic mean of all measurements

Error: Half of 99.9% confidence interval

StdDev: Standard deviation of all measurements

Ratio: Mean of the ratio distribution ([Current]/[Baseline])

Baksiden av medaljen er at disse nye typene er tregere å konstruere enn eksisterende liste-typer. Her vist med List<T> og HashSet<T> som sammenligningsgrunnlag.

image: Dette er nytt i .NET 8: - Ganske imponerende!

Begge disse ytelsestestene er kjørt på min Macbook Pro med Intel i7 2,3 GHz Quad-Core prosessor med åtte logiske kjerner. Operativsystemet er macOS Sonoma 14.0 og .NET 8.0.100-preview.6.23330.14.

Kildekoden til disse ytelsestestene finnes her.

Native AOT-støtte

Da .NET 7 ble lansert november 2022 var den, etter min mening, viktigste funksjonaliteten støtte for Native AOT. Enkelt forklart vil dette si at applikasjonen din pakkes som en eksekverbar fil, uten masse .dll-er som kommer fra avhengighetene du har hentet fra nuget o.l.

Du trenger heller ikke å installere .NET Runtime for å kjøre applikasjonen.

I .NET 8 er denne funksjonaliteten videreutviklet, og støtter nå x64 og arm64 på macOS. Det er også gjort en betydelig jobb med å få ned filstørrelsen. Publiserte man en enkel Hello World-applikasjon Native AOT ville denne være cirka 3,7 MB for en Linux x64 Distro.

Til sammenligning vil denne applikasjonen kun være 1,8 MB for .NET 8. Ganske imponerende!

"Primary Constructors"

Da C# 9 ble lansert november 2020, ble det også introdusert en ny type kalt record.

En "record" er veldig enkelt forklart en immutable datatype hvor likheten mellom to instanser av en record bestemmes av verdiene av datene fremfor minnereferansen som en referanse type by default gjør, med mindre man overloader likhets operatorene. En record har siden introduksjonen kunne definere det vi kaller for Primary Constructors.

public record(string Address, string City, string Zipcode, string Country)

Denne mekanismen blir nå tilgjengeliggjort for klasser og structs i C# 12. Dette er utelukkende syntaktisk sukker som reduserer antall linjer med kode.

Eksempelet hentet fra mitt GitHub repo viser en veldig simpel bruk av denne funksjonaliteten:

public class Car(string make, string model, IEnumerable<Trip> trips) 
{ 
    public string MakeModel => $"{make} {model}";  
    public decimal DistanceTraveled => trips.Sum(t => t.Distance);
}

I C# 12 vil det bli mulig å benytte seg av using-aliaset til å deklarere typer, og ikke bare named types. Disse typene vil kun være tilgjengelig i den filen de er deklarert. Hendig om man trenger deklarere en type, som ikke skal være tilgjengelig andre steder i assemblyet.

Jeg ser for meg at dette muligens kan være til nytte i deserialisering/serialisering av typer til i et integrasjonslag mot en tredjeparts løsning. En eksempel implementasjon ser slik ut:

using Point = (double x, double y); 
Console.WriteLine(new Point(1.3, 5.4));

Justering av minnebegrensning runtime

I .NET 8 kommer et et nytt API som gjør det mulig å justere minnebegresninger dynamisk under eksekvering. Dette er spesielt nyttig for applikasjoner som kjører i skyen hvor ressursbruken korresponderer med trafikken mot applikasjonen.

Jeg er spent på å se hvordan dette API-et blir tatt i bruk, og hvordan dette samspiller med f.eks Kubernetes sitt konsept om Resource Management.

Standardverdier i lamba-uttrykk

At et lambauttryk nå kan definere standardverdier kan sees på lik linje med standardverdier til en metode:

public decimal IncludeVAT(decimal price, decimal factor = 1.25) => price * factor;

Omskrevet som et lambauttrykk:

var priceWithVat = (decimal price, decimal factor  = 1.25) => price * factor;

Oppsummering

Denne artikkelen er ikke uttømmende hva gjelder ny funksjonalitet i .NET 8, men heller hva artikkelforfatteren anser som nyttig i den gjengse .NET-utviklers hverdag. Den dekker heller ikke spesifikke endringer eller nyheter i for eksempel ASP.NET Core, Blazor, eller MAUI.

For en komplett oversikt se gjerne offisielt lanseringsnotat.

Jeg vil også sterkt anbefale å lese Stephen Toub sin bloggserie “Performance Improvements in .NET x”.

Den 14/11-23 blir .NET 8 lansert på den virtuelle gratis-konferansen dotnetConf. Påmelding og agenda blir lansert på https://www.dotnetconf.net/. I mellomtiden er det bare å installere Preview og RC versjoner av .NET 8. Dette kan du gjøre herfra.

Er du interessert i å diskutere .NET, teknologi eller programvareutvikling når du meg på Twitter/X med handle @Thorstensen, eller i kommentarfeltet.