Neues zu Roslyn und C#

Seite 4: Filter, Nutzer

Inhaltsverzeichnis

Mit Filtern für Exceptions erhält C# endlich eine Funktion, die schon aus Visual Basic.NET und F# bekannt ist (siehe folgender Codeauszug).

try 
{
...
}
catch (Exception e) if (CheckStatus(e))
{
...
}

Nur wenn die Methode CheckStatus true zurückliefert, führt das Programm den Catch-Block aus. Andernfalls wird die Exception einfach eine Ausführungsebene nach oben gereicht – so, als wenn es den Block gar nicht gäbe.

Ein Vorteil solch eines Vorgehens ist, dass dadurch der Stacktrace im ursprünglichen Zustand verbleibt. Anders, als wenn der Catch-Block immer aktiv ist und im Zweifel die Exception über das Schlüsselwort throw erneut geworfen wird.

Die letzte Neuerung betrifft das Schüsselwort await, das nun in finally- und catch-Blöcken erlaubt ist. Bisher war das nicht der Fall, da Microsoft laut eigener Begründung bisher nicht wusste, wie sich das Feature implementieren lässt. Offensichtlich hat sich das geändert, wie der Ausschnitt zeigt:

string result = null;

try
{
result = await CalculateResultAsync();
...
}
catch(CalculateResultException e)
{
await Log.WriteAsync(e);
}
finally
{
if (result != null)
{
await WriteResultAsync(result);
}
}

Auch mit C# 5.0 eingeführte Funktionen rund um async und await können, dank Roslyn, nun in finally und catch zum Einsatz kommen. Das macht einige unschöne Workarounds während der Entwicklung unnötig.

Aber wer profitiert nun von Roslyn im Allgemeinen und den Neuerungen in C# im Konkreten? Zum einen sind es Entwickler, die jeden Tag mit der Sprache und der Entwicklungsumgebung Visual Studio zu tun haben. Durch neue Features können Vereinfachungen Einzug in C# halten, wobei selbiges für Fehlerkorrekturen und sonstige Verbesserungen gilt.

Ganz allgemein hat Microsoft vor, neue Versionen von Roslyn, C# und dadurch auch von Visual Studio schneller auf den Markt zu bringen. Microsoft hat wohl gemerkt, dass es in der heutigen Zeit nicht mehr möglich ist, sich jahrelang einzuschließen, um danach mit einer neuen Produktpalette aufzuwarten. Kunden lassen sich nicht gerne vor vollendete Tatsachen stellen, sondern möchten gerne Einfluss auf die Entwicklung nehmen. Ob das gelingt und wie gut der schnellere Produktzyklus angenommen wird, muss sich zeigen.

Roslyn-Entwicklern, die mehr für C# implementieren möchten, etwa Werkzeuge zur Code-Analyse, bieten sich durch die umgesetzten Maßnahmen ebenfalls Vorteile. Durch die Neugestaltung des Compilers in Module lassen sich letztere separat in eigene Projekte übernehmen. Dafür steht unter anderem das NuGet-Paket Microsoft.CodeAnalysis zur Verfügung. Die darin enthaltenen Komponenten sind zudem über eigene Pakete einzeln verfügbar. Auch Scripting und eine bessere Code-Generierung lassen sich so umsetzen.

Letztlich profitiert auch die Community rund um C#. Auf der BUILD 2014 präsentierten Miguel de Icaza und Anders Hejlsberg Roslyn beziehungsweise C# auf Mono. Und zwar keine ältere Version, sondern exakt die, die kurz zuvor unter Windows als Beispiel diente. Das bedeutet, dass es in Zukunft vermutlich eine bessere und breitere Unterstützung für Unix-Systeme geben wird. Nicht zuletzt ist dadurch Visual Basic.NET auf Mono möglich.

Bei Roslyn handelt es sich zweifelsohne um eine weitere Community Technology Preview (CTP), die Entwickler auf Herz und Nieren prüfen sollten. Ein produktiver Einsatz ist daher zunächst nicht zu empfehlen. Zudem sind noch nicht alle gewünschten Funktionen implementiert. Tabelle 2 enthält dazu eine kleine Übersicht aus Sicht von C#, die zeigt, welche Funktionen bereits vorhanden und welche für zukünftige Releases geplant sind. Eine vollständige Liste, die auch Visual Basic.NET betrachtet, befindet sich in der Dokumentation auf CodePlex.

Feature Beispiel Status C#
Primary constructors class Point(int x, int y) { … } Done
Auto-property initializers public int X { get; set; } = x; Done
Getter-only auto-properties public int Y { get; } = y; Done
Using static member using System.Console; … Write(4); Done
Dictionary initializer new JObject { ["x"] = 3, ["y"] = 7 } Done
Indexed member initializer new JObject { $x = 3, $y = 7 } Withdrawn
Indexed member access c.$name = c.$first + " " + c.$last; Withdrawn
Declaration expressions int.TryParse(s, out var x); Done
Await in catch/finally try … catch { await … } finally { await … } Done
Exception filters catch(E e) if (e.Count > 5) { … } Done
Binary literals 0b00000100 Planned
Digit separators 0xEF_FF_00_A0 Planned

Tabelle 2: Übersicht über bereits implementierte und geplante Funktionen der aktuellen Roslyn-Version.