Mit dem Release von .NET Core 3.0 kam auch C# 8.0 und brachte einige neue Features mit. Im Folgenden Blogpost sind einige von ihnen aufgelistet.
Nullable Reference Types
Mit Nullable Reference Types gibt es jetzt die Möglichkeit, in der kompletten Codebasis das Verhalten zu ändern, ob ein Referenztyp NULL sein darf oder nicht. Wird das neue Verhalten aktiviert, so muss wie bereits bei Value Types explizit über ein “?” (z.B. string?) angegeben werden, dass der Referenztyp NULL annehmen kann. Wenn die Variable einen NULL-Wert zugewiesen bekommt, erzeugt der Compiler eine Warnung. Das neue Verhalten kann über die Projektdatei aktiviert werden, indem in einer Property Group das Nullable Element mit Wert enable hinzugefügt wird.
Dieses neue Verhalten bringt den Vorteil, dass nun explizit sichtbar wird, welche Variablen einen NULL-Wert beinhalten können oder um NULL langsam aber sicher aus der Codebasis zu entfernen.
Asynchronous Streams
C# 8.0 gibt die Möglichkeit, Streams asynchron zu erstellen. Die asynchrone Stream Methode benötigt drei Eigenschaften:
- Deklaration mit async
- Rückgabe von IAsyncEnumerable<T>
- yield return Anweisungen, um nacheinander folgende Elemente im asynchronen Stream zurückzugeben
Eine Methode hat die Möglichkeit einen asynchronen Stream zu verwenden und zu erzeugen. Dadurch wird IAsyncEnumerable zurückgegeben.
Abbildung 1: Asynchronous streams Beispiel Teil 1
Um die Sequenz zu durchlaufen, wird eine await foreach-Anweisung aufgerufen.
Abbildung 2: Asynchronous streams Beispiel Teil 2
Indices/Ranges
C# 8.0 bietet zur Sprachunterstützung zwei neue Typen und zwei neue Operatoren:
- System.index, um einen Index in einer Sequenz darzustellen
- ^-Operator, um anzugeben, dass ein Index am Ende der Sequenz ist
- Nehmen wir ein Array als Beispiel. Der 0-Index entspricht array[0]. Der ^0-Index entspricht array[array.length]. Hier sollte man darauf achten, dass sowohl array[array.length] sowie array[^0] eine Exception wirft.
- System.Range, um einen Unterbereich darzustellen
- (..) als Bereichsoperator um den Beginn und das Ende eines Bereichs als Operanden anzugeben.
- Der Bereich gibt den Beginn inklusive dem Startindex und das Ende ohne den letzten Index an. So gibt [0..^0] genauso wie [0..array.length] den ganzen Bereich an.
Null-Coalescing Assignment
C# 8.0 führt den neuen Null-Coalescing Assignment Operator ??= ein. Mit dem ??= Operator kann man den rechten Operanden zum linken Operanden zuweisen, wenn der linke Operand den Wert Null hat. So erspart man sich lästige if-Abfragen oder einen Null-Coalescing Operator.
Abbildung 3: Null-coalescing Beispiel
Default Interface Member
Default Interface Member ermöglicht es, Member zu Interfaces hinzuzufügen, um diesen eine Implementierung bereitzustellen. Dadurch wird es API-Autoren ermöglicht, einer Schnittstelle in neueren Versionen Methoden zu geben, ohne die Quell- oder Binärkompatibilität mit vorhandenen Implementationen zu beeinträchtigen. Bestehende Implementierungen erben die Standardimplementierung. Dadurch wird die Interaktion zwischen C# und APIs, die auf Android und Swift abzielen und ähnliche Funktionen unterstützen, möglich.
Abbildung 4: Default interface member Beispiel Teil 1
Abbildung 5: Default interface member Beispiel Teil 2
Im Beispiel wird WarningWriter bereits im Interface IText definiert und kann somit direkt aufgerufen werden, ohne die Methode in der Text Klasse zu überschreiben.
Using Declarations
Die using-Deklaration ist eine Variablendeklaration mit dem Schlüsselwort using. Dieses Schlüsselwort informiert den Compiler, dass die Variable am Ende des Geltungsbereichs aufgeräumt werden soll. Ein Fehler wird erzeugt, wenn der Ausdruck in der using-Anweisung nicht aufgeräumt werden kann (keine Implementierung von Dispose).
Abbildung 6: Using declaration Beispiel
Sprechen Sie uns an, wenn auch Sie Fragen zu Themen rund um .NET Core haben oder Hilfe bei Portierung Ihrer Anwendung nach .NET Core 3.0 in Ihrem Unternehmen benötigen. Wir führen Sie gerne ans Ziel.