C# 9 - Was gibt's Neues?
Noch fünf Monate, dann erscheint C# 9 - doch was gibt es eigentlich alles Neues? Und für wen sind all die Neuerungen gedacht?
Release mit .NET 5
Der offizielle Startschuss von C# 9 ist der 10. November 2020, wenn auch .NET 5 veröffentlicht wird.
Doch schon heute kann man sich die Preview von .NET 5 herunterladen, ausprobieren und C# 9 kennenlernen. Dazu gibt es die entsprechenden SDKs auf https://dot.net. Bei den Previews empfiehlt es sich auch immer die Visual Studio Preview zu verwenden, da diese sehr sehr viel früher entsprechenden SDK-Preview erhält.
Neu: Die Records
Mit C# 9 wird es eine neue Form von Klassen geben, die speziell für Datenstrukturen gedacht sind: die Records.
Um eine Klasse als Record zu deklarieren, muss das Schlüsselword data
vorangestellt werden.
data class Person { string Firstname; string LastName }
Die Besonderheit - und der Sinn - von data
ist, dass damit das Objekt eine value-ähnliche Eigenschaft enthält, ohne dabei jedoch als struct
behandelt zu werden. Also ganz im Sinne der Performance und dem speicherschohnenden Umgang.
Init Only Properties
Datenstrukturen werden meistens so verwendet, dass die entsprechenden Objekte einmalig erstellt, jedoch nicht mehr verändert werden - gerade zB. bei der Verwendung als DTO (Data Transfer Object).
Entsprechend macht das neue Schlüsselwort init
sinn: es definiert, dass eine Eigenschaft nur bei der Initialisierung des entsprechenden Objekts gesetzt werden kann - danach vollständig read-only.
public data class Person
{
public string FirstName { get; init; }
public string LastName { get; init; }
}
Neues im Pattern Matching
Pattern Matching - also der typische Syntaxzucker und damit das vereinfachen der C# Schreibweise - hat sich durch all die letzten C# Versionen gezogen; viel wurde von anderen Sprachen übernommen - sinvolles und auch eher schwieriges.
Auch in C# 9 gibt es neues im Pattern Matching.
Es ist diesmal so ausführlich, dass ich an dieser Stelle besser auf den Build 2020 Talk von Mads Torgersen verweise.
Vereinfachtes Instanziieren von Objekten
Bisher musste man immer die Klasse "doppelt" nennen, wenn man ein Objekt erstellen wollte. Die sogenannte target type new expression
hat jedoch nun ebenfalls Einzug gehalten, die sich sehr viele gewunschen haben.
Person peter = new Person("Peter", "Pan");
Mit C# 9 kann man sich die zweite Nennung des Typs sparen.
Person peter = new ("Peter", "Pan");
Das Ganze funktioniert natürlich nicht mit var
;-)
Covariant returns
Im Umgang mit OOP und entsprechenden Vererbungsstrukturen hat man sich oft ein Override gewunschen, mit dem man auch den Return Type ändern kann. Hatte man eine abstrakte Klassen, die für viele als Basis verwendet wurde, so konnte man entsprechend einen Typ für eine Methodenrückgabe definieren.
Beispielsweise ein Tier, das entsprechend "irgendein" Futter erhält.
abstract class Animal
{
public abstract Food GetFood();
...
}
Bei der Konkretisierung der abstrakten Klasse - hier Tiger basierend auf Animal - hätte man das "Futter" nun aber nicht allgemein, sondern konkret: Fleisch.
class Tiger : Animal
{
public override Meat GetFood() => ...;
}
Dies ist nun mit C# 9 möglich, sodass man sich entsprechende Hilfstrukturen sparen kann und wirklich direkt mit der konkreten Klasse arbeiten kann.
Native Ints
C# erhält nach vielen Jahren auch mal wieder einen neuen Datentypen: die Native Ints.
Den wirklichen Mehrwert werden vor allem die spüren, die sehr Performance-hungrige Algorithmen bzw. Low Level Code und Co schreiben, da der fokussierte Zweck der Performance unterliegt: native ints entsprechend exakt der Wortgröße der CPU, sodass der JIT besseren und schnelleren Maschinencode erzeugen kann.
Aktueller Fortschritt auf GitHub
Auf GitHub zeigt das Team rund um C# transparent, welche Features bereits fertig sind, welche Neuerungen noch Feedback aus der Community brauchen und welche Ideen existieren.