Nützliche C# Spracherweiterungen
In diesem Beitrag stelle ich einige nützliche C# Spracherweiterungen vor, NuGet Pakete mit denen die Implementierung neuer Software noch komfortabler wird. OneOf, Optional oder Lazy erweitern den Funktionsumfang von C# und bringen bekannte Funktionalität anderer Programmiersprachen in die .NET Welt.
Nützliche C# Spracherweiterungen
C# wird mit jeder Version besser. Wünsche der Entwickler-Community werden von Microsoft ernst genommen und sinnvolle Features implementiert. Genau so werden oft genutzte Design Pattern, Interfaces oder Klassen ins .NET bzw. aktuell ins .NET Core Framework aufgenommen. So gut auch die jeweiligen aktuellen Versionen auch sind, oft findet man trotzdem noch nützliche NuGet Pakete von findigen Entwicklern die das Leben eines Entwicklers weiter verbessern. Einige Beispiele davon stelle ich hier vor. Den Code findet man wie üblich auf meiner GitHub Seite.
Optional
Optional ist mein persönlicher Favorit. Setzt man den Optional Datentyp konsequent im Code ein erspart man sich jegliche Null Checks. Der Quellcode ist dadurch nicht nur besser lesbar, er ist per Definition schon sicherer. Eine Null-Exception kann nicht mehr auftreten.
NuGet Optional installieren
NuGet wird über Visual Studio wie folgt installiert:
Verwendung
In einem einfachen Beispiel im Dungeon and Dragons Kontext habe ich eine Funktion erstellt, die von einem NPC eine Quest abfragt. GetQuest liefert ein Quest Objekt, oder falls der NPC keine Quests mehr hat keine Quest. Ohne Optional würde man null zurück liefern und im aufrufenden Code eine null Abfrage implementieren. Das machen wir nicht!
Der Code:
GetQuest gibt ein Objekt vom Typ Option<Quest> zurück. Anhand von einer zufälligen Zahl wird entweder eine neue Quest erstellt und mit Option.Some<Quest>(quest) als Optional Objekt erstellt und zurück gegeben. Sofern es keine Quest mehr gibt wird Option.None<Quest>() zurück gegeben.
Spannend ist nun noch die Abfrage beim Aufrufenden Code. Dort hilft die Match Memberfunktion um mit Lambda Funktionen beide Fälle abzudecken. In meinem einfachen Beispiel wird nur ein Informationstext auf der Konsole ausgegeben. Eine Ausführung des Codes liefert zum Beispiel folgendes Ergebnis:
OneOf
Der Datentyp OneOf aus C# entspricht dem Datentyp union von C++. Man definiert einen Speicherbereich für eine beliebige Anzahl unterschiedlicher Typen. Diese Typen müssen sich in keiner Vererbungshierarchie befinden. Die Variable selbst kann jeden beliebigen Wert der definierten Typen annehmen. Konkret wird im Speicher Platz für den größten der möglichen Typen angelegt.
NuGet OneOf installieren
OneOf wird über Visual Studio wie folgt installiert:
Verwendung
OneOf eignet sich sehr gut, wenn man es mit einer Reihe möglicher Typen zu tun hat die einer Funktion übergeben werden können oder von dort zurück gegeben werden. Ich habe ein Beispiel im DnD Kontext erstellt bei dem ein zufälliges Objekt erstellt wird. Je nach Wurf kommt ein Human, Orc oder ein neues Dungeon zurück. Diese Objekte stehen in keiner Vererbungshierarchie und können deshalb nur mit OneOf zusammengefasst werden.
Im aufrufenden Code werden 10 solcher zufälliger Objekte in einer Liste zusammengefasst und nach der Erstellung wird für jedes Element die ToString Methode aufgerufen. Das sieht in der Ausgabe beispielsweise so aus:
Serilog
Serilog habe ich bereits in einem ausführlichen Serilog Artikel beschrieben. Mit Hilfe von Serilog kann man das Logging einer Applikation recht einfach konfigurieren und je nach Anwendungsfall auf unterschiedliche Ziele ausgeben.
Eine gelebte Sprache entwickelt sich stets weiter
Ich komme eigentlich von C++ und dort ist seit Ewigkeiten die boost Bibliothek die Quelle von Innovationen im Standard der C++ Sprachsyntax. In den Standards der letzten Jahre wurden immer wieder seit Jahren übliche Pattern und Klassen aus boost in die STL übernommen. Aus dem großen Fundus an tollen Ideen kann der Programmierer auch lange vor dem „standard“ werden diese Tools nutzen um besseren Code schreiben. Ein guter C++ Entwickler kennt deshalb boost gut und braucht beim nächsten Standard nur die Klassennamen (oder eventuell sogar nur den Namespace) tauschen.
Bei C# sehe ich große Parallelen. Auch dort gibt es dank der einfachen Integration von 3rd Party Assemblies durch NuGet eine super einfache Methode die Sprache beziehungsweise das Framework durch sinnvolle neue Features zu erweitern. Es gibt fast immer jemanden der ein Problem bereits clever gelöst und in eine Open Source Bibliothek gepackt hat. Viele davon werden auch laufend gewartet und weiter entwickelt.
Fazit
Ich habe ein paar nützliche Erweiterungen für C# vorgestellt mit denen die Entwicklung neuer Software einfacher wird. Eine Programmiersprache funktioniert ähnlich wie eine normale Sprache, sie lebt und entwickelt sich stets weiter. Neue Design Patterns, Bibliotheken oder Syntax erleichtern einem Entwickler die Arbeit.