C# 7 – Stand der Dinge und Ausblick

Seite 5: Weitere Neuerungen & Fazit

Inhaltsverzeichnis

Momentan genießen die gezeigten Erweiterungen für C# 7 die höchste Aufmerksamkeit. Dennoch gibt es zahlreiche kleinere, aber durchaus nützliche Features, die das Roslyn-Team für die kommende Version der Sprache diskutiert und ausprobiert. Interessierte Entwickler können die lange Liste auf GitHub einsehen.

Verschiedene Erweiterungen für Attribute stehen im Raum. Die Unterstützung generischer Attribute in C# ist denkbar. Auch Attribute, die nur zur Kompilierzeit existent sind, stehen zur Diskussion. Sie sind für die Verwendung vor der Erstellung des IL-Codes (Intermediate Language) gedacht. Für sie können auch gelockerte Vorgaben wie Typrestriktionen gelten. Das Einsatzgebiet von Attributen könnte auch dahingehend erweitert werden, dass die Sprachelemente auf weitere Code-Elemente wie auf Lambda-Ausdrücke angewandt werden.

Microsoft sieht vor, weitere Sprachkonstrukte in C# asynchron zu machen. Unter anderem sollen asynchrone Sequenzen beziehungsweise Streams Einzug in die Sprache halten. Vorstellbar wäre dann ein asynchrones Foreaching. Das würde folgendes Interface erfordern:

public interface IAsyncEnumerable<T>
{
public IAsyncEnumerator<T> GetEnumerator();
}
public interface IAsyncEnumerator<T>
{
public T Current { get; }
public Task<bool> MoveNextAsync();
}

Die Methode MoveNext würde in dem Fall kein bool mehr zurückgeben, sondern Task<bool>. Asynchrones Foreaching bringt aber verschiedene Probleme mit sich. Dazu gehört, dass die Asynchronität einer Foreach-Sequenz nicht immer im Code sichtbar ist, was zu unvorhersehbarem und schwer zu wartendem Verhalten führen kann. Um dennoch die Vorteile nutzen zu können, will das Team unter anderem die foreach-Syntax erweitern, wie folgender Code-Schnipsel zeigt:

foreach (string s in asyncStream) { ... } 
foreach async (string s in asyncStream) { ... }
foreach (await string s in asyncStream) { ... }

Ein IAsyncDisposable-Interface, das auch die Asynchronität des using-Statements erlaubt, ist ebenso denkbar.

Das Team um die Microsoft .NET Compiler Platform ist recht umtriebig. Es schaut sich andere Sprachen an und versucht, erfolgreiche und nützliche Konzepte abzuleiten oder lässt sich zumindest inspirieren. Unter anderem hat das Roslyn-Team einen Blick auf Go geworfen. Das Interesse richtet sich vor allem auf die Channels in der von Google entwickelten Sprache.

Dabei handelt es sich um Kommunikations-Pipelines zwischen Threads. Programme können Inhalte in die Pipelines hingeben und wieder herausholen. In Go muss der aufrufende Code warten, wenn er versucht, ein Element aus einer leeren Pipeline herauszuholen. Ebenso muss das Programm warten, wenn es ein Element hineingeben will, während die Pipeline voll ist. Das Roslyn-Team würde diese Endpunkte gerne awaitable machen, sodass der aufrufende Code asynchron weiterarbeiten kann. Ein derartiges Feature befindet sich vorerst aber nur in der Diskussion. Microsoft möchte zuerst Erfahrungen sammeln und schauen, in welchem Zusammenhang Channels mit asynchronen Sequenzen und Konzepten aus der DataFlow-Bibliothek stehen.

Interessierte Entwickler können die neuen Features bereits ausprobieren. Dazu müssen sie aus Git den entsprechenden Branch auschecken. In dem Patterns-Branch ((https://github.com/gafter/roslyn/tree/features/patterns)) befinden sich beispielsweise viele der neuen Erweiterungen wie Local Functions und einige Prototypen für algebraischen Datentypen und Pattern Matching. Die Aktivierung der Features erfolgt mittels Compiler Flags wie /features:patterns. Der oben genannte Branch aktiviert bei Verwendung der Präprozessordirektive __DEMO__ sämtliche Features.

Offensichtlich gehen dem Team rund um die .NET-Compiler-Plattform die Ideen für neue Sprachkonzepte nicht aus. Schließlich kommen aus der Community ein umfangreiches Feedback und viele Anfragen für Erweiterungen. Das Team schaut zudem ständig, wie es Code vereinfachen kann und welche sich häufig wiederholende Code-Segmente es in LOB-Anwendungen (line of business) findet. Noch steht aus, welche der beschriebenen Konstrukte es in die nächste Generation von C# tatsächlich schaffen werden, wobei einige Features größeres Interesse genießen.

Auffällig ist das Einfließen vieler Sprachkonzepte aus anderen Welten, darunter die funktionalen und Skript-Sprachen. C# wird damit immer mehr zu einem Allrounder. Betrachtet man demgegenüber JavaScript und die Evolution zu ECMA6 sowie TypeScript, mit denen objektorientierte Konzepte Einzug in die nicht typisierte Sprache halten, kann man feststellen, dass die Mainstream-Sprachen sich zunehmend aufeinander zu bewegen.

Zu hoffen bleibt, dass C# nicht in seiner Syntaktik erstickt, sondern Entwickler auch mit der kommenden Generation guten, überschaubaren Code schreiben können – Code, den auch unerfahrene Entwickler noch verstehen und warten können.

Robin Sedlaczek
hat mehr als fünfzehn Jahre Erfahrung als professioneller Softwareentwickler und Projektleiter. Seit vier Jahren ist er als CTO bei der Fairmas GmbH tätig und ist dort zuständig für den gesamten Entwicklungsbereich. In seiner Freizeit organisiert er die .NET User Group Berlin-Brandenburg und vermittelt sein Wissen auf Konferenzen, in User Groups, Onlinekursen, Fachartikeln und in seinem Blog. Er ist erreichbar via Twitter.
(rme)