Neues zu Roslyn und C#
Seite 4: Filter, Nutzer
Filtern und abwarten
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.
Wem nutzt das Ganze?
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.
Aktueller Stand
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.