Nieuwe features in C# 7
4

Met de komst van Visual Studio 2017 is er ook een nieuwe versie van C# beschikbaar gekomen. In de nieuwe versie zijn weer een aantal verbeteringen in de taal doorgevoerd. Deze verbeteringen zullen we in deze blog even de revue laten passeren.

Out variabelen
In C# 6.0 hebben we een variabele van een expliciet type nodig om door te geven aan een methode die een out-parameter verwacht.

Met de komst van C# 7.0 kunnen we dit stukje code herschrijven tot

In deze codeconstructie kun je zelfs gebruik maken van het var-keyword

De scoping van de variabele is het omvattende blok, dus na de aanroep naar de methode die een out-parameter verwacht, kun je de parameter gewoon gebruiken.
Als je niet geinteresseerd bent in de waarde die via een out-parameter teruggegeven wordt, dan kun je er voortaan ook voor kiezen om deze te ‘negeren’ door een _ te gebruiken.

Is-pattern matching

In veel projecten komt code voor die variabelen van het ene type in het andere omzet en aan de hand van de omgezette waarde iets met die waarde gaat doen. In C# 6.0 is dit vaak nog best code intensief als je dit veilig wilt doen. Met de komst van de pattern matching mogelijkheden van C# 7.0 kan dit veel eenvoudiger.
Het volgende code voorbeeld bepaalt of een parameter een positief geheel getal is gebruik makend van de nieuwe mogelijkheden van C# 7.

Het is mogelijk om een object direct te vergelijken met een constante waarde inclusief null. Met behulp van de is-operator kun je nu ook direct de waarde uit een controle krijgen. Je hoeft dus niet meer met behulp van de combinatie is en as de waarde op te halen.

Patterns in switch
Ook binnen een switch statement kun je gebruik maken van patterns.

Zoals in de bovenstaande code te zien, kun je binnen een pattern match ook nog gebruik maken van aanvullende controles. Dit heeft wel direct tot gevolg dat de volgorde van de selecties binnen een switch belangrijk worden. Dit geldt niet voor de default-controle, want deze wordt altijd als laatste geëvalueerd. De mogelijkheden van een switch statement worden met behulp van deze feature een stuk krachtiger. Het is wel belangrijk om in de gaten te houden dat je niet teveel logica in een switch statement stopt. Dit is vaak een signaal dat je beter een andere design pattern had kunnen gebruiken.

Tuples
Tuples binnen .NET bestaan al wat langer. Een tuple is een handige constructie om meerdere waarden uit een methode te retourneren zonder dat je hiervoor een klasse hoeft te maken. Het gebruik van tuples was alleen nog een beetje onhandig. Gelukkig is het gebruik een stuk beter geworden. Voortaan kun je tuples teruggeven zonder Tuple<T1,T2,…> te gebruiken, maar kun je direct gebruik maken van een constructie met (). Gelukkig kunnen we zelfs de onderdelen binnen de tuple nu voorzien van een beschrijvende naam, waardoor we niet meer hoeven te onthouden op welke positie een bepaalde waarde terug wordt gegeven.
Een methode die een volledige naam splitst in de onderdelen, kunnen we dus nu definiëren als:
(string first, string middle, string last) ParseFullName(string fullName)

Deconstruction
Voor het opvangen van het resultaat van een tuple kun je de volgende codeconstructie gebruiken:
(first, middle, last) = ParseFullName(fullName);
Dit wordt ook wel de deconstructing assignment genoemd.

Local functions
Soms wil je in het kader van seperation of concerns een kleine stukje code binnen een methode los trekken zonder dat je ooit de ambitie hebt om dit stukje code te hergebruiken in een ander deel van je code. Je kunt dit nu oplossen door gebruik te maken van een local function:

Binnen de local function kun je ook gebruik maken van alle variabelen in scope, dus je hoeft in het code voorbeeld prefix niet als parameter mee te nemen.

Literal improvements
Binnen C# bestaat al lang de mogelijkheid om literals in de code op te nemen. De leesbaarheid van de waarden liet alleen soms nog wel te wensen over. Om de leesbaarheid te vergroten bestaat nu de mogelijkheid om scheidingstekens toe te voegen, zonder dat dit waarde beïnvloedt. Hiervoor wordt het _ teken gebruikt.

Met ingang van C# 7 is het nu ook mogelijk om binaire literals aan te maken in de code.

Return by ref
We kunnen al geruime tijd value types by reference doorgeven als parameter aan een methode. Het is nu ook mogelijk om return values by ref terug te geven.

De mooie oplopende reeks is nu niet zo mooi oplopend meer:

Expression bodied members
In C# 6.0 hebben we de mogelijkheid gekregen om expression bodied functions te schrijven. Met de komst van 7.0 is het nu ook mogelijk om deze syntax te gebruiken bij constructoren, destructoren en properties.

Throw Exceptions in expressions
Binnen C# 7.0 wordt de mogelijkheid geboden om binnen een paar constructies direct een exception te throwen. Een voorbeeld hiervan kun je zien in het bovenstaande voorbeeld.

Conclusie
Met de komst van C# 7.0 heb je weer wat extra mogelijkheden in je gereedschapskoffer. Let wel op met de leesbaarheid van je code, want compactere code wil niet altijd zeggen dat de code ook beter leesbaar is.

Auteur: Menno Jongerius, Bergler Competence Center © 2017