Dette blir nytt med .NET 5 og C# 9

Tobias forklarer hvorfor .NET Core forsvinner, og hva som venter deg i C# 9.

Tobias Moe Thorstensen er "Community Lead .NET & Senior Software Consultant" i Knowit Amende, og har sett nærmere på hva som kommer i .NET 5. 📸: Privat
Tobias Moe Thorstensen er "Community Lead .NET & Senior Software Consultant" i Knowit Amende, og har sett nærmere på hva som kommer i .NET 5. 📸: Privat Vis mer

Det har skjedd en hel del siden Microsoft lanserte .NET Framework 1.0 tidlig på 2000-tallet.

I løpet av de siste årene har vi fått kjennskap til diverse skytjenester, Kubernetes og Docker med mer. Microsoft innså at om .NET skulle ha livets rett, måtte man utvikle rammeverket i en retning hvor koden kunne kompilere og kjøres på andre plattformer enn bare Windows baserte systemer.

Dette førte til at .NET Core ble lansert sommeren 2016. Siden 2016 har det kommet en rekke oppdateringer av .NET Core, hvor siste versjon, 3.1, ble lansert i slutten av 2019.

Her stopper det. Vi kommer ikke til å høre mer om .NET Core etter denne versjonen. Microsoft ønsker ikke å skape forvirring rundt forskjellen på .NET Framework og .NET Core.

Som resultat av dette introduserer Microsoft kun ett rammeverk, nemlig .NET.

Men hvorfor?

Så hvorfor gjør Microsoft dette? Før vi kikker på dette er det viktig å forstå forskjellen på .NET Core, .NET Framework, .NET Standard og BCL.

Rammeverkene har sin egen Base Class Library, også forkortet til BCL. BCL er en implementasjon av .NET Standard.

Som du sikkert har skjønt er kun .NET Standard en API-spesifikasjon. Med andre ord vil det si at de ulike rammeverkene har sin egen implementasjon av .NET Standard, også kalt BCL. Jeg velger å tenke på .NET Standard som et interface, hvor BCL er en implementasjon av interfacet.

📸: blogs.msdn.microsoft.com
📸: blogs.msdn.microsoft.com Vis mer

Det kommer frem av tegningen at introduksjonen av nyere versjoner av .NET Standard krever ulik implementasjon i de ulike rammeverkene.

Dette blir tungt å vedlikeholde over tid. Det er nettopp dette som er grunnen til at Microsoft velger å kvitte seg med .NET Core og .NET Framework, og kun kalle det for .NET.

Når det er sagt, vil Microsoft fortsette å supportere .NET Framework i form av bugfikser og oppdateringer til kryptografi -og nettverksbibliotekene så lenge Windows er supportert.

Målet til Microsoft ved å lansere .NET 5 er at man kun skal trenge å forholde seg til en versjon av .NET Runtime som kan benyttes hvor som helst, og oppfører seg likt uavhengig av platform.

📸: devblogs.microsoft.com
📸: devblogs.microsoft.com Vis mer

Første versjonen av .NET 5 ble lansert i Preview 16. Mars 2020, og det er ventet at den går ut av Preview i November 2020. Heretter vil vi få major oppdatering av .NET hver November slik roadmapen til Microsoft ser ut nå.

Med .NET 5 kommer også C# 9 og F# 5. I C# 9 kommer det en rekke nye, kule features.

Under har jeg skrevet litt om mine favoritt features som jeg har testet ut så langt:

«I C# 9 kommer det en rekke nye, kule features.»

Init-keyword

Når du tidligere skulle initialisere et objekt med immutable properties, måtte man sette disse i kontruktøren. I C# 9 er det blitt introdusert et nytt keyword som kalles for init.

Istedenfor å markere en property som private set, ta inn den reelle verdien i en kontruktør og sette verdien til propertyen, kan man bare markere en property med init.

Du har følgende objektdefinisjon:

public class Account
{
    public Guid Id { get; private set; } = Guid.NewGuid();
    public double Amount { get; init; }
    pubic DateTime Expires { get; init; }
}

Da kan objektet initialiseres slik:

var account = new Account
{
    Amount = 1000,
    Expires = DateTime.Now.AddYears(5);
}

Hvor man tidligere måtte sette hhv. Amount og Expires gjennom en konstruktør gitt at de hadde markert set som private.

Value-based equality

I klassen object finnes det en metode som heter Equals(object other). Denne er markert som virtual, og kan derfor overrides.

I C# 9 introduserer man noe som kalles for Value-based equality. To objekter kan være like, enten at de har den samme referansen i minnet eller at propertyene i objektet er likt.

Dette vil si at om man har to objekter:

var person = new Person(firstName: “John”, lastName: “Doe”);
var person1 = new Person(firstName: “John”, lastName: “Doe”);

Så vil ReferenceEquals(person, person1) returnere false hvor Equals(person, person1) vil returnere true ettersom de har de samme verdiene satt.

Records

I C# 9 introduserer man konseptet Records som gjør at en hel klasse betraktes som immutable.

For de som har jobbet domene drevet, kan en Record ansees som et value object. Et value object er en klasse hvor likhet defineres av like verdier og ikke en identifikator. For å endre på objektet, må det instansieres et nytt objekt.

Fordelen med Records er som nevnt at de er immutable, dette vil si at data kun kan settes ved opprettelse av objektet. Ettersom at data ikke kan endres utenfor objektet, kan det bli delt mellom tråder og dermed unngår man race conditions.

En annen stor fordel med records er at objektet oppfører seg som en value type, fremfor en reference type. Man slipper også å skrive et mye logikk for å validere at en property har riktig verdi.

For å benytte seg av Records bruker man keyword record:

public record Address
{
    public string Street { get; init; }
    public string City { get; init; }
    public string ZipCode { get; init; }
}

Hele spesifikasjonen til denne implementasjonen ligger på GitHub.

.NET 5 blir lansert på dotnetconf den 10–12 November 2020. Anbefaler å melde dere på dette gratis online-seminaret.

Om du ønsker å teste ut .NET 5 er det mulig å laste ned previews herfra.

Om du er interessert i følge utviklingen av .NET anbefaler jeg utviklerbloggen til Microsoft.