Kleine Schritte in C# 7.1 und 7.2

Die Agilität ist auch im Entwicklungsteam von C# angekommen: Erstmals gibt es kleinere Releases der Programmiersprache, und C#-Entwickler können unabhängig von der verwendeten Visual-Studio-Version die gewünschte Sprachversion beim Kompilieren wählen.

Sprachen  –  3 Kommentare
Kleine Schritte in C# 7.1 und 7.2
Anzeige

Im August 2017 ist mit Version 7.1 im Rahmen von Visual Studio 2017 Update 3 (v15.3) erstmals eine C#-Version erschienen, bei der sich die Versionsnummer an der zweiten Stelle verändert. Die neue Version bringt dementsprechend auch nicht eine Vielzahl, sondern lediglich vier kleinere Neuerungen in der Sprachsyntax.

Zuvor war die Versionsfolge von C# stetig:

  • C# 1.0 (alias ISO-C# 1) erschien 2002,
  • C# 2.0 (ISO-C# 2) folgte 2005
  • C# 3.0 kam 2008 heraus
  • C# 4.0 veröffentlichte Microsoft 2010,
  • C# 5.0 stammt aus dem Jahr 2012,
  • C# 6.0 ist 2015 erschienen und
  • C# 7.0 erschien im März 2017.

Für die Kommandozeile csc.exe lässt sich der C#-Compiler Microsoft.Net.Compilers als Nuget-Paketherunterladen. Die aktuell verfügbare Version 2.4 unterstützt C# 1.0 bis 7.1.

Das erste neue Sprachfeature ist eine Erweiterung der in C# 7.0 eingeführten Tupel. Beim Erstellen eines Tupels aus Variablen in C# 7.1 übernimmt der Compiler die Variablennamen als Elementnamen für das neue Tupel, wie folgendes Listing zeigt:

// Drei Variablen...

int ID = 1;
string Name = "Holger Schwichtenberg";
bool DOTNETExperte = true;

// Tupel erstellen aus den drei Variablen

var dozent = (ID, Name, DOTNETExperte);

// Tupel verwenden

var dozent = (ID, Name, DOTNETExperte);

Console.WriteLine(dozent.ID);
Console.WriteLine(dozent.Name);
Console.WriteLine(dozent.DOTNETExperte);

Die Serialisierung übernimmt jedoch nicht die Elementnamen, sondern erzeugt die Namen Item1, Item2, Item3 und so fort. Die Elementnamen sind nur syntaktischer Zucker des Compilers, die die Common Language Runtime (CLR) und die darauf aufbauenden .NET-Compiler nicht zu sehen bekommen. Für die Serialisierung mit dem BinarySerializer ist das .NET Framework in der Version 4.7.1 erforderlich. Erst sie enthält die Klasse System.ValueTupel, die die Basis für die C#-Tupel ist.

Die zweite Neuerung in C# 7.1 ist ebenfalls eine Erweiterung einer in C# 7.0 eingeführten Option. Allerdings fällt diese Verbesserung wohl eher in die Kategorie "Bugfix", wie der zugehörige Issue im Roslyn-Repository auf GitHub zeigt. Microsoft hatte in C# 7.0 das Pattern Matching mit dem is-Operator eingeführt, der nach erfolgreicher Typprüfung zugleich eine Typkonvertierung ausführt. In C# 7.0 funktioniert das aber nicht mit generischen Methoden wie bei PrintObject() im folgenden Listing. Der Compiler beschwert sich mit der Meldung "An expression of type 'T' cannot be handled by a pattern of type 'Kunde'". Ab Visual Studio 2017 Update 3 heißt die Meldung "An expression of type 'T' cannot be handled by a pattern of type 'Kunde' in C# 7. Please use language version 7.1 or greater.". Tatsächlich kompiliert und funktioniert der Programmcode mit C# 7.1.

class Kunde
{
public int ID { get; set; }
public string Name { get; set; }

...
}

class StammKunde: Kunde
{
...
}

...

var k = new Kunde() { ID = 1, Name = "Max Mustermann" };
PrintObject<Kunde>(k);

var sk = new StammKunde(){ ID = 1,
Name = "Holger Schwichtenberg" };
PrintObject<Kunde>(sk);

...

static void PrintObject<T>(T o)
{
if (o is StammKunde sk)
{
Console.WriteLine("Objekt ist ein StammKunde mit Namen: "
+ sk.Name);
return;
}

if (o is Kunde k)
{
Console.WriteLine("Objekt ist ein Kunde mit Namen: "
+ k.Name);
}
}

Seit Version 1.0 von C# lassen sich Variablen mit dem Schlüsselwort default auf den Standardwert eines Typs initialisieren. Bisher mussten Entwickler aber nach default den Typnamen nochmals angegeben.

int a1 = default(int); // = 0
string s1 = default(string); // = null
Kunde k1 = default(Kunde); // = null

In C# 7.1 können sie sich die zusätzliche Arbeit sparen, indem sie auf die Wiederholung des Typnamens verzichten. Visual Studio 15.3 und höher bieten diese Verkürzung auch per Assistenzvorschlag an:

int a2 = default;
string s2 = default(string);
Kunde k2 = default;

Die vereinfachte asynchrone Programmierung mit den Schlüsselwörtern async und await hatte Microsoft in C# 5.0 im Jahr 2012 eingeführt. Während die Ereignisbehandlungsroutinen in den GUI- und Webframeworks von Microsoft seit .NET 4.5 auch mit async deklariert sein konnten, war das bisher für die Einsprungmethode des Hauptprogramms Main() nicht erlaubt. Entwickler mussten darin für den Aufruf einer asynchronen Methode GetDataAsync() schreiben:

static int Main()
{
return GetDataAsync().GetAwaiter().GetResult();
}

Neuerdings funktioniert der Aufruf in Main() genauso wie in anderen Methoden:

static async Task<int> Main()
{
return await GetDataAsync();
}

Die Sprachversion für C# war in der Vergangenheit von Visual Studio und dem verwendeten .NET Framework abhängig. Schon C# 7.0 lieferte Microsoft nicht mehr als Teil des .NET Framework 4.7 aus, sondern zusammen mit Visual Studio 2017 (v15.0) im März 2017. Seit dem dritten Update zu Visual Studio 2017 (v15.3) können Softwareentwickler nun in den Projekteigenschaften eines C#-basierten .NET-Projekts unter der Registerkarte Build | Advanced Build Settings | Language Version die Sprachversion einstellen. Sie können damit auch eine ältere Sprachversion mit einem neuen Visual Studio verwenden. Der umgekehrte Weg funktioniert vorerst jedoch nicht. Abbildung 1 zeigt dementsprechend nicht Version 15.3, sondern die kommende Version 15.5 von Visual Studio (aktuell: Preview 4 vom 14.11.2017), da sich darin bereits C# 7.2 auswählen lässt.

Freie Sprachversionswahl in Visual Studio 2017 15.5 Preview 3 (Abb. 1)

Nachdem Entwickler ein Projekt mit einer neuen Visual-Studio-Version erstellt und dort eine aktuelle C#-Version gewählt haben, können sie das Projekt nicht mehr mit einer älteren Visual-Studio-Variante kompilieren, die die Sprachversion noch nicht kennt. Mit der Nachricht "Invalid option '7.2' for /langversion; must be ISO-1, ISO-2, Default, Latest or a valid version in range 1 to 7.1." lehnt Visual Studio 2017 Update 4 (v15.4) ein Projekt mit C# 7.2 ab.

Die eingestellte Sprachversion speichert Visual Studio in der Projektdatei (.csproj) im Tag LangVersion ab, beispielsweise als <LangVersion>7.2</LangVersion>. Beim Kommandozeilencompiler csc.exe lässt sich die Sprachversion über den Parameter /LangVersion festsetzen:

csc.exe Program.cs /langVersion:7.0
Anzeige