03 dec 2020 #Backend

Door Sander ten Brinke access_time10 min

Nieuw in C# 9.0

C# 9.0 is uit! Benieuwd wat het is en waarom je het zou willen gebruiken? Onze Arcadian Sander ten Brinke legt het je uit. Hij neemt je mee in de features van C# 9.0 en waarom hij hier zo blij van wordt. Ook geeft hij wat stukken voorbeeldcode waardoor je de nieuwe features beter begrijpt en zelf kunt toepassen. Doe er je voordeel mee!

Nieuw in C# 9.0

Het begin.

Voor de mensen die C# (je spreekt het uit als C sharp) niet kennen, is C# een programmeertaal ontwikkeld door Microsoft. Het wordt vooral gebruikt in de object georiënteerde wereld, maar kan ook steeds breder worden ingezet. Het is vooral populair bij het bouwen van backend applicaties met bijvoorbeeld ASP.Net Core. Maar je kan er bijvoorbeeld ook met Unity of Godot games mee bouwen. Zelfs het bouwen van front-end applicaties met Blazor is tegenwoordig mogelijk. C# is eigenlijk een hele veelzijdige programmeertaal. Wil je meer weten over C# en hoe het wordt ontworpen? Check dan eens: github repo.

Wat is nieuw?

C# is aanbeland bij versie 9.0. Elke versie brengt nieuwe features en verbeteringen met zich mee. Ik zet de 4 meest interessante veranderingen (althans voor mij) voor je op een rij.

  • Init only setters
  • Verbeteringen voor het new keyword
  • Top-level statements
  • Er zijn verder ook andere toffe verbeteringen, zoals records en verbeterde pattern matching. Ik zie mijzelf hier nog niet vaak gebruik van maken, dus voor nu blijven deze even buiten dit artikel. Maar ik raad je zeker aan om dit even op te zoeken.

Init only setters

Init only setters maken het makkelijker om het instantiëren van een object wat "correcter" neer te zetten. Een goed voorbeeld is deze situatie:

In veel projecten maak je gebruik van DTO's. Dit zijn Data Transfer Objects, en zijn eigenlijk types die je gebruikt om data door te geven aan een andere laag van je applicatie. Deze DTO's kunnen vaak redelijk wat properties bevatten. Om zo'n type op een makkelijke manier te instantiëren kun je op dit moment twee dingen doen. 1) Je gebruikt een constructor. 2) Je gebruikt Object initializers, ook wel bekend als de properties, om het object aan te maken. Het gebruik van constructors bij klasse met veel properties brengt een aantal nadelen met zich mee. Deze zijn algemeen bekend. Vandaar dat ik hier niet verder op in ga. Wel vertel ik je meer over het gebruik van de Object initializers en hoe init only setters je kunnen helpen.

Stel we hebben de volgende DTO:

Er zijn wat nadelen met deze aanpak. Bijvoorbeeld dat je je properties hierna nog mag wijzigen door bijvoorbeeld userDto.Voornaam = achternaam; kan typen. Dit is niet gewenst; zo'n DTO maak je een keer aan en geef je door; je wilt properties niet meer wijzigen.

Init only setters helpen je hierbij met de volgende syntax:

Wanneer je nu een instantie hebt van het UserDto type en je probeert Voornaam te wijzigen

userDto.Voornaam = achternaam;

Dan zal je een error krijgen van de compiler. Je mag de property namelijk slechts één keer setten en dat is tijdens het instantiëren van het object.

Verbeteringen voor het new keyword

Tijdens de aankondiging van deze feature werden er redelijk wat negatieve reacties gegeven. Dit komt omdat er nu een 3de manier is om in je code de objecten aan te maken met het new keyword. De eerste manier is door het type expliciet te beschrijven:

UserRepository repository = new UserRepository ( ) ;

Dit is simpel genoeg. Het enige probleem met deze aanpak is dat je redelijk wat moet typen. In C# 3 is het var keyword geïntroduceerd. Dit maakt het iets makkelijker:

var repository = new UserRepository ( ) ;

Tijdens compile-time checkt de compiler het type dat erbij hoort. Als je probeert om het type te wijzigen (repository = new Dog ( ) ; ), krijg je een error. Het enige verschil is dus dat je wat minder hoeft te typen. Dit is vooral handig bij code zoals Dictionary<int,

UserState> dictionary = new Dictionary<int, UserState> ( ). Het is veel makkelijker om de code te lezen. Aan de rechterkant van de expressie zie je al van welk type het object het zal zijn, dus waarom zou je het aan de linkerkant ook vereisen?

Nu, in C# 9 wordt de 3de manier geïntroduceerd... Hou je vast!

Dictionary<int, UserState> dictionary = new ( ) ;

Nu denk je misschien: "Wat is het voordeel? Dit is het omgekeerde van het var keyword. Nu staat er meer code aan de linkerkant dan aan de rechterkant!". Dit was ook mijn eerste reactie, en ook de reactie van veel andere mensen. Maar wat blijkt, het is eigenlijk een zeer handige toevoeging.

In eerste instantie moest je deze stukken code typen:

In dit soort gevallen heb je redelijk veel code die je twee keer moet typen.

Nu nogmaals met het gebruik van new ( ):

 

Top-level statements

Top-level statements maken het een stuk makkelijker voor mensen om te beginnen met C#. Een bestand in je programma hoeft namelijk een stuk minder boilerplate te bevatten!

Het kan ook gebruikt worden in bestaande c# applicaties, maar ik raad dit af vanwege de restricties die opgelegd worden met het gebruik van deze feature. Maar ook vanwege het weinige voordeel dat het heeft in bestaande codebases. Ik kom zometeen nog terug op de restricties. Zie bijvoorbeeld dit standaard "Hello world" voorbeeld:

Voor mensen die C# kennen is dit simpel genoeg. We snappen wat er gebeurt. Maar voor beginners is dit een ander verhaal. Waar je met python gewoon met print ("Hello World!") begint, begin je met C# met de volgende onderwerpen:

  • Wat is een using?
  • Wat is een namespace?
  • Wat is een class?
  • Wat zijn die { } ?
  • Wat is die Main regel? En wat is static en void? Waarom zijn er string [ ] args?
  • Console? Waar komt dat vandaan?
  • Wat doet die ; daar? En waarom alleen op de regel van de using en op de regel van de Writeline ( )?

Voor beginners is dit niet heel vriendelijk.

Top-level statements kunnen beginners hierbij helpen. Met top-level statements wordt de volgende code ‘onderwater’ hetzelfde als de code hierboven:

Dit is handig voor beginners! Zo kunnen ze beetje bij beetje meer leren over de onderwerpen die ik hierboven benoemde.

Daarnet had ik het over restricties. Dit zijn er twee:

  • Slechts één bestand in de applicatie mag gebruik maken van top-level statements
  • Je mag het niet combineren met program entry methods zoals Main ( ); die wordt namelijk onderwater voor je aangemaakt.

Oftewel, gebruik dit om C# te leren. Misschien zelfs om een paar kleine console projecten te maken of misschien in kleine Azure Functions. Maar ik zou niet de Program.cs van een bestaand project aanpassen om dit te gebruiken. Voor mensen die deze feature niet kennen, zal het verwarrend zijn. Je krijgt niet veel voordeel hiervan.

Nog meer veranderingen die eraan gaan komen.

Ik hoop dat je het interessant vond om meer te lezen en te leren over C# 9.0. Wil je meer weten? Check dan dit artikel.

Naast C# 9.0 zal er binnenkort veel meer gebeuren in de wereld van .NET. Zo wordt .NET 5 uitgebracht, een nieuw framework dat probeert om alle verschillende .NET omgevingen (.NET Core, .NET Framework, Mono) samen te brengen. Daarnaast wordt er hard gewerkt aan .NET MAUI, een nieuw UI Framework van Microsoft. Hiermee kan je straks moderne UI applicaties bouwen voor zowel desktop als voor telefoons. Een evolutie van Xamarin.

Genoeg materiaal om je in te verdiepen dus! Zou je graag meer willen weten over deze ontwikkelingen, of heb je vragen over dit artikel? Mail mij gerust!

Sander ten Brinke | sander@arcady.nl

Angular 11 update: Dit zijn de highlights
Volgend bericht
Angular 11 update: Dit zijn de highlights