12. Dezember 2017 / von Jens Lorek

Die

Zukunft

von C#

Ein Blick in die Glaskugel

Vor nicht all zu langer Zeit wurde mit Version 7.2 das zweite Point Release der C#-Spezifikation veröffentlicht. Bis zur Erscheinung von Version 8 wird noch einige Zeit vergehen, doch bereits jetzt kann man sich im offiziellen Github-Repository ansehen, welche Features mögliche Kandidaten für den kommenden Release sind. Die Diskussion über neue Vorschläge ist öffentlich – jeder darf mitmachen und seine Meinung zu den verschiedenen Vorschägen kundtun. [1] [2]

Wir haben uns die C# 8 Preview mit Mads Torgersen auf Channel9 angesehen und alle Proposals näher unter die Lupe genommen, welche mit einer gewissen Wahrscheinlichkeit ihren Weg in die Spezifikation von C# 8 schaffen werden. [3]

Nullable Reference Types

Tony Hoare gilt als der Erfinder des Null Pointers. In der Retrospektive bezeichnete er diese Entscheidung als seinen “Billion Dollar Mistake”. In Anbetracht aller Null Pointer Exceptions die wir im Laufe der Zeit schon gesehen und behoben haben ist diese Aussage nicht von der Hand zu weisen. [4]

Auch in C# kann einer Referenz-Variable der Wert Null zugewiesen werden. Um möglichen Fehlern nun aus dem Weg zu gehen, sollte sie vor jedem Zugriff auf Null geprüft werden. Der dazu nötige Schreibaufwand wurde mit dem in C# 6 eingeführten Null Conditional Operator deutlich reduziert.

Für C# 8 ist nun ein Feature in Vorbereitung, welches einen bedeutenden Schritt weiter geht. Referenz-Typen sollen nun – analog zu Werte Typen – standardmäßig nicht mehr den Wert Null annehmen können. Es ist zwar weiterhin möglich einer Referenz Null zuzuweisen, dies wird vom Compiler jedoch mit einer Warnung quittiert. Soll eine Referenz-Variable den Wert Null annehmen dürfen, so muss dies explizit deklariert werden. [5]

Screenshot C-Sharp

Die erste Frage welche sich vielen Entwicklern nun stellt ist: “Beschert mir der Compiler für meinen bisherigen Code nun eine Myriade an Warnungen?”
Die Antwort ist simpel: Das Feature kann je nach Bedarf an- und abgeschaltet werden. So können wir unsere vorhandenen Projekte in Zukunft noch frei von Warnings kompilieren und auch in neuen Projekten auf Wunsch auf dieses richtungsweisende Feature verzichten. Ob das Feature standardmäßig an oder ausgeschaltet sein wird, bleibt noch offen.

Async Streams

Die Umsetzung von asynchronen Programmabläufen ist in C# mit den async/await-Schlüsselwörtern sehr gut gelöst. Es gibt jedoch immer noch Bereiche, welche von diesem Paradigma noch nicht vollständig durchdrungen sind. Asynchrone Entry-Methoden werden beispielsweise erst ab C# 7.1 unterstützt. [6]

In C# 8 ist nun die Unterstützung von asynchronen Streams in Form von asynchronen Iteratoren geplant. [7]

Neben dem Einführen eines entsprechenden Interfaces soll auch das foreach-Schlüsselwort erweitert werden, um den Zugriff auf einen asynchronen Iterator zu ermöglichen. Die angedachte Syntax sieht dabei wie folgt aus.

Screenshot C-Sharp

Um eine asynchrone Quelle nach dem Zugriff wieder in in einen ordentlichen Zustand zurück zu setzen, ist im gleichen Zuge ebenfalls die Einführung einer asynchronen IDisposable-Schnittstelle geplant.

Interface Default Implementations

Interfaces können ab C# 8 nun Default-Implementierungen für ausgewählte Methoden liefern. Es mag zunächst nach einem fundamentalen Bruch klingen, nun auch Code in einer Interface-Definition zu sehen. Auch ist der Unterschied zur Verwendung einer abstrakten Klasse auf den ersten Blick vielleicht nicht gleich ersichtlich. Doch in Java ist dieses Konzept unter dem Namen Default Methods bereits seit längerer Zeit umgesetzt. Interface Default Implementations ermöglichen uns, Schnittstellen zu einem späteren Zeitpunkt zu erweitern, ohne jede implementierende Klasse einzeln anpassen zu müssen. Sie vereinfachen auf diese Weise zum Beispiel die Versionierung von Schnittstellen. Neue Funktionalität kann – in einem gewissen Maße – auch nachträglich hinzugefügt werden. Eine weitere Möglichkeit ist die Umsetzung einer milden Art von Mehrfachvererbung, welche in C# bisher nicht möglich gewesen ist.[8]

Screenshot C-Sharp

Interface Default Implementations sind im Gegensatz zu den bisher vorgestellten Erweiterungen kein reiner syntaktischer Zucker. Zur Umsetzung der Funktionalität muss die Funktionsweise von Interfaces in der CLR angepasst werden, wie Mads Torgersen in seinem Preview verrät.

Extension Everything

Extension Methods sind seit C# 3 verfügbar und ermöglichen das Erweitern von Klassen um zusätzliche Methoden. Jeder von uns hat sie schon in der Form des LINQ Query Syntax verwendet und die meisten von uns haben sich nicht nur einmal gewünscht, eine Klasse um mehr als nur Instanzmethoden erweitern zu können – ohne diese ableiten zu müssen. In C# 8 wird dies nun eventuell möglich. Unter dem Titel “Extension Everything” verbirgt sich das Vorhaben C# um das neue Keyword extension zu erweitern. [9]

Screenshot C-Sharp

Der neue Syntax erlaubt dann die Verwendung von Properties, Events, Operatoren oder statischen Methoden als Extensions. Auch die Möglichkeit ein Interface mit Hilfe von Extensions erweitern zu können ist in der Diskussion.

Fazit

Die .NET Foundation zeigt in ihrem offenen Repository eine Kultur, in welcher neue Features in der Community diskutiert und bewertet werden können. Zusammen mit der stetig zunehmenden Geschwindigkeit, mit welcher Microsoft die Entwicklung von C# und .NET in jüngster Zeit vorantreibt, sehe ich eine Sprache, die stetig versucht sich unseren Bedürfnissen und Wünschen angemessen anzunähern. Wir sind gespannt, welche Features es letzten Endes in die C#8-Spezifikation schaffen werden und halten Auge und Ohren offen um euch zu diesem spannenden Thema weiterhin auf dem Laufenden zu halten.

Autor

Weitere Artikel

Das könnte Sie auch interessieren