De laatste jaren zijn er veel verbeteringen en uitbreidingen uitgekomen, die ontwikkelen in C# nog mooier maken. Ik kan me voorstellen dat je ze niet allemaal bijhoudt. Dit zijn zes mooie nieuwe ontwikkelingen die je kunt toepassen in je code.
Records als data object
In veel code zie je zogenaamde data transfer objecten terugkomen. Dit zijn objecten die bedoeld zijn om informatie door te geven. Over het algemeen zijn dit objecten die, nadat ze aangemaakt worden, niet gewijzigd worden. Je kunt hier tegenwoordig in C# ook het record type voor gebruiken. Een record is een class (dus een reference object) waarin standaard immutability en value equality geïmplementeerd is. Wel zo gemakkelijk:
Om een record nog gemakkelijk te maken, kun je de publieke properties van de record gewoon achter de naam typen. De properties van een record implementeren de nieuwe init setter waardoor ze wel geserialiseerd kunnen worden, maar niet te wijzigen zijn.
File scoped namespace
Omdat elk code bestand over het algemeen begint met de namespace, hebben bestanden eigenlijk een nodeloze nesting van de class in de namespace. Door een file scoped namespace te gebruiken, ben je die extra nesting kwijt.
Bekende constructie met geneste class in de namespace:
Nieuwe mogelijkheid van file scoped namespaces:
Ik zou hier nog wel graag aan toe willen voegen dat als je file scoped namespaces gebruikt, je deze wel altijd op de eerste regel van een bestand zet met daaronder een lege regel en dan de usings. Op die manier houd je wel onderscheid tussen de namespace en de usings.
Global usings
Je kunt ze wel, van die usings die eigenlijk zo’n beetje in elk bestand terugkomen. Door één bestand te introduceren met global usings, hebben automatisch alle bestanden in je project deze usings.
Enige kanttekening is misschien dat het in de scope van een bestand niet altijd duidelijk is dat de global usings ook beschikbaar zijn. Daarom zou ik ze alleen gebruiken voor de echte basis verwijzigingen die in nagenoeg elk bestand zitten (bijvoorbeeld System).
String literals
Het was vroeger nogal een dingetje om grotere tekstinput in een C# bestand te verwerken. Stel bijvoorbeeld dat je in een test wat ruwe json wil gebruiken. Nu kun je die natuurlijk in aparte bestanden zetten en inlezen, maar het zou in veel gevallen fijner zijn als je het gewoon als parameter in je code kan zetten. Dat kan nu met string literals:
De string literal begint en eindigt met minimaal drie “-tekens.
Pattern matching
Nu moet ik eerlijk zeggen dat ik een beetje een haat-liefde verhouding heb met pattern matching. In sommige gevallen levert het mooie leesbare en compacte code op, maar in andere gevallen komt er een volstrekt onleesbaar gedrocht uit. Maar goed, voor de gevallen dat het wel iets moois oplevert is het zeer de moeite waard om er kennis van te hebben:
Primary constructors
Zeker in de wereld van dependancy injection, wil het nog wel eens wat overbodige code opleveren om alle private fields te implementeren.
Huidige constructie met backing fields:
Nieuwe constructie met primary constructor:
Zeker met een groter aantal dependancies die in de constructor meekomen, scheelt dit best wat code. Het is ook wat gemakkelijker te onderhouden omdat je de dependancies op één plek in de klasse kunt beheren en niet de velden apart moet bijhouden.
Let op: de constructie lijkt wat op die in record-types, alleen in een record worden het automatisch public properties terwijl in een class het private readonly fields zijn.