Picture: Microsoft

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.