En ny udgave af C#, Microsofts flagskib blandt .NET-sprogene, er snart på trapperne.
».NETCore 3.0 er tæt på færdiggørelse, og holdet bag fokuserer udelukkende på stabilitet og pålidelighed, nu hvor vi ikke længere bygger nye faciliteter,« skrev Richard Lander, som er Program Manager i .NET-teamet i et blogindlæg i sidste uge.
Det seneste preview af .NET Core 3, kom på gaden i sidste uge, har nummeret syv og og kommer med C# 8 i favnen.
Der er mange nyheder i den nye version, og sprogets chef-designer, Mads Torgersen, der har overtaget tøjlerne fra opfinder Anders Hejlsberg, har tidligere peget et par stykker af dem ud i et blogindlæg.
Mads Torgersen har en fortid som lektor og ph.d i datalogi fra Aarhus Universitet, så sproget bliver på danske hænder. Og det kan vi vel godt tillade os at være lidt stolte over.
Nej til null
Null-værdier er et smertensbarn i objektorienterede sprog, og sådan har det været i ganske mange år, mener Mads Torgersen:
»Vi har foregivet det de sidste 50 år med objektorienteret programmering, men faktisk er null ikke et objekt. Derfor eksploderer alt, når du prøver at behandle det som om det er et. Så ikke mere af det: Null er verboten, medmindre du beder om det. Hvordan beder du om det? Ved at bruge en ‘nullable’ referencetype, såsom streng?
- det efterfølgende spørgsmålstegn signalerer, at null er tilladt her.«
I Visual Studio skal den nye facilitet slås til i projekt-filen .csproj, hvor linjen
<NullableReferenceTypes>true</NullableReferenceTypes>
– skal tilføjes. Og det skal også være preview-udgaven af Visual Studio, der anvendes.
Hvis man skriver følgende program, der i øvrigt indeholder en tikkende bombe - en null-initieret variabel:
using static System.Console; class Program { static void Main(string[] args) { string s = null; WriteLine($"The first letter of {s} is {s[0]}"); } }
– giver udviklingsværktøjet en fejl: Der klages over, at en ‘ikke-nullable type’ tildeles værdien null.
Hvis man alligevel vil tildele s værdien null, skal det gøres med det tidligere nævnte spørgsmålstegns-operator:
string? s = null;
Men den næste linje, hvor s udskrives, giver stadig bøvl. Compileren kan, se, at s eventuelt kan være null. Problemet løses på denne vis:
if (s != null) WriteLine($"The first letter of {s} is {s[0]}");
– hvor compileren kan regne ud, at s ikke kan være null inde i kroppen på if-sætningen.
En anden og mere kompakt måde at opnå det samme på, er:
WriteLine($"The first letter of {s} is {s?[0] ?? '?'}");
– hvor spørgsmålstegnsoperatoren returner null eller en char, afhængigt af, om s er null eller ej, og ??
-operatoren udskifter null med tegnet ‘?’.
Mads Torgersen følger faciliteten til dørs med denne kommentar:
»Som du kan se, holder faciliteten dig fast på redeligheden, mens du koder: Den tvinger dig til at udtrykke din hensigt, når du vil have null i systemet, ved at bruge en 'nullable' referencetype. Når først null er til stede, tvinger det dig til at håndtere det på en ansvarlig måde, hvilket får dig til at kontrollere, når der er risiko for, at en null-værdi muligvis kan blive referet til, for så at udløse exception.«
Intervaltyper
Ranges er en ny intervaltype, ligesom det kendes fra eksempelvis Pascal. Det kan benyttes til at definere delintervaller, som i eksemplet herunder. Det er en feature, som kan minde om ‘slices‘ i sprog som Python og Rust.
using System.Collections.Generic; using static System.Console; class Program { static void Main(string[] args) { foreach (var name in names[1..4]) { WriteLine(name); } } static IEnumerable<string> GetNames() { string[] names = { "Archimedes", "Pythagoras", "Euclid", "Socrates", "Plato" }; foreach (var name in names) { yield return name; } } }
En Range kan skabes således
Range range = 1..4;
– hvor 1 er inklusiv og 4 eksklusiv, og endepunkterne er af typen Index
.
En ny operator ^
er det også blevet til, og den betyder ‘fra slutningen af.’ Så intervallet
foreach (var name in names[1..^1])
– betyder fra og med indeks 1 til én fra slutningen. Her i eksemplet returneres derfor de tre elementer i midten af arrayet.
Ranges kan med preview 7 bruges med arrays, string.SubString, Span
Asynkrone streams
Den sidste af nyhederne, som Mads Torgersen har valgt at fremhæve, er asynkrone streams, som i eksemplet herunder:
using System.Collections.Generic; using static System.Console; using System.Threading.Tasks; class Program { static async Task Main(string[] args) { await foreach (var name in GetNamesAsync()) { WriteLine(name); } } static async IAsyncEnumerable<string> GetNamesAsync() { string[] names = { "Archimedes", "Pythagoras", "Euclid", "Socrates", "Plato" }; foreach (var name in names) { await Task.Delay(1000); yield return name; } } }
Her simuleres en asynkron arbejdsbyrde med en asynkron pause i linjen await Task.Delay(1000)
.
Interfacet IAsyncEnumerable
er er asynkron udgave af IEnumerable
.
Den resulterende metode GetNamesAsync()
await’er så hvert enkelt element i stream’en.
.NET Core 3.0 preview 7 kan downloades fra Microsofts hjemmeside.

...men det er dyrt at lave god journalistik. Derfor beder vi dig overveje at tegne abonnement på Version2.
Digitaliseringen buldrer derudaf, og it-folkene tegner fremtidens Danmark. Derfor er det vigtigere end nogensinde med et kvalificeret bud på, hvordan it bedst kan være med til at udvikle det danske samfund og erhvervsliv.
Og der har aldrig været mere akut brug for en kritisk vagthund, der råber op, når der tages forkerte it-beslutninger.
Den rolle har Version2 indtaget siden 2006 - og det bliver vi ved med.