Her er Danmarks fem bedste CIO’er lige nu:Se de fem nominerede til prisen som Årets CIO 2024

Artikel top billede

(Foto: Computerworld)

Skriv koden hurtigere med ny C#

Hvis du udvikler ved hjælp af C#, har du meget at glæde dig over i den nye version 9. Den er ingen revolution, men du kan i nogle tilfælde programmere hurtigere.

Af Michell Cronberg, Alt om Data

Denne artikel er oprindeligt bragt på Alt om Data. Computerworld overtog i november 2022 Alt om Data. Du kan læse mere om overtagelsen her.

Microsoft frigav i november 2020 den nye .NET 5 – se omtalen i AOD nr. 1 – som især var fokuseret på at gøre .NET klar til en sammenlægning af samtlige runtimes til den kommende .NET 6. Men der var også en ny version af det populære C#-programmeringssprog.

Ser man tilbage på frigivelsen af den foregående opdatering af C#, var der ikke de helt store, revolutionerende nyheder. I C# 8 blev vi blandt andet introduceret for nullable reference types, men sproget er ret tæt på at være komplet, og nye tilføjelser handler meget om mikrooptimering og syntakssukker.

Nu er vi så nået til C# 9. Heller ikke her bliver verden sat på den anden ende efter lanceringen, men der er alligevel flere opsigtsvækkende features til C#-udviklernes værktøjskasse. Det bliver hurtigere at skrive kode.

Nyt i immutable data

De største nyheder finder vi indenfor immutable data (en lidt tynd dansk oversættelse er vel ”uforanderlige data”), hvilket i bund og grund handler om, at når først data er placeret i hukommelsen, kan de ikke tilrettes igen. Det skaber både sikkerhed og mulighed for optimering og er en stor bestanddel af andre (især funktionsorienterede) sprog.

I C# har man altid kunne skabe immutable typer ved at gemme data væk i private felter, som kun kan aflæses gennem offentlige egenskaber, og som udelukkende kan tildeles en værdi gennem en constructor. Men for at kunne initialisere objekter uden en constructor skulle man kunne tildele felter en værdi gennem en offentlig egenskab eller metode, og så er objektet ikke længere immutabelt. Det er rettet i C# 9, hvor en egenskab nu kan defineres med init-kodeordet. Se figur 1, hvor en anden ny feature også kan ses. Det er nu muligt at benytte new-kodeordet uden typenavn.

Når man tidligere skabte sine egne immutable typer har det også været normal praksis at overskrive metoderne Equals og GetHashCode fra System.Object samt operatorerne == og !=. På den måde kan objekterne sammenlignes på værdier og ikke på referencer – ligesom objekter af System.String, som jo er baseret på en klasse, men sammenlignes på værdi.

Hvis man ønsker at skabe den form for immutable typer, er der virkelig hjælp at hente i den nye C# 9, fordi den nye record-type gør definering og brug meget simpel. I figur 2 kan du se defineringen af en terning med to immutable-egenskaber. Defineringen fylder en linjes kode, hvilket skal sammenlignes med mindst 15-20 linjer i C# 8. Bemærk i øvrigt, at det er nemt at kopiere værdier fra et objekt til et andet ved hjælp af with-kodeordet. Det er også en ny C# 9-feature.

Den nye record-type kan også indeholde egne medlemmer og indgå i et arvehierarki med andre record-typer, men den immutable funktionalitet bliver autogeneret helt automatisk.

I både forrige og i denne version af C# er der tilføjet en del muligheder relateret til mønstergenkendelse (pattern matching), og det er endnu et tegn på, at sproget bliver forfinet med muligheder, som findes i andre sprog. I C# 9 er der tilføjet forskellige logiske operatorer, og det vil uden tvivl blive brugt en del i fremtiden. Det giver blandt andet mulighed for at skrive kode med en syntaks, som er mere menneskelig.

Eksempelvis vil det være oplagt for mennesker at sige, at ”hvis x er større end 10 og mindre end 20, så ...”, men i C#-syntaks har man skullet skrive ”hvis x er større end 10, og hvis x er mindre end 20”. Det giver samme resultat, men førstnævnte er naturligvis nemmest og mere logisk at skrive i kode, og det er nu muligt, som det fremgår af figur 3.

Analyse af koden

En af de mere avancerede features i C# 9 er muligheden for at skrive kode, som medtages på et meget tidligt tidspunkt i kompileringsprocessen. På den måde kan man analysere koden og tilføje yderligere filer bestående af nye typer eller metoder til eksisterende (partial) metoder. Det kaldes source generators og kan blandt andet benyttes til konvertering af eksterne filer til typer eller automatisk optimering.

Det smarte er, at det sker som en integreret del af kompileringsprocessen, så den nye genererede kode er tilgængelig i Visual Studio omgående, fordi der baggrundskompileres konstant. Overordnet minder det lidt om de gamle T4-templates i Visual Studio med den store forskel, at source generators afvikles på et meget tidligere tidspunkt og giver mange flere muligheder.

Men C# står aldrig stille. Den 10. version af C# forventes at komme sammen med .NET 6 til november. 

3 nyheder i den opdaterede C#


Figur 1: Der er flere gode nyheder. Her ser du anvendelsen af det nye init-kodeord. Desuden viser billedet af en kodestump i C# 9 en ny og nemmere måde at oprette objekter på.


Figur 2: Den nye record-type autogenererer en immutabel klasse med fokus på værdier og ikke referencer. Og bemærk den nye brug af with.


Figur 3: Der er en del nye muligheder relateret til pattern matching med i C# 9. Her et par af de simple, men meget effektive nye mønstre.