Gibt es Änderungen?
12.03.2014, 00:00 Uhr
C# 6.0 - Was kommt auf uns zu?
Die Microsoft-Konferenz Build findet vom 2. bis 4. April 2014 in San Francisco statt. Es wird erwartet, dass Microsoft einiges Neues ankündigt. Wird sich aber auch was bei der Sprache C# tun? Eine Sammlung von Spekulationen.
Mit welchen Funktionen überrascht Microsoft wohl die C#-Entwickler? Dieser Artikel gibt eine Zusammenfassung der Spekulationen, die momentan durch das Internet geistern, etwa von DamienG, Smart Software, Christians Nagel's Blog, Jürgen Gutsch. Fragen Sie sich bei jedem Feature mal selber: "Ist das nützlich?".
C# ist eine der 10 beliebtesten Programmiersprachen, wenn man dem Tiobe-Index vertraut. Im Februar 2014 belegte C# mit 6,45 Prozent Platz fünf knapp hinter C++. Visual Basic .NET betrat in der Rangliste die Top 10 zum ersten Mal. Tiobe-Index: Welche Programmiersprache ist die beliebteste?
Tiobe-Index: Welche Programmiersprache ist die beliebteste?
Tiobe-Index: Welche Programmiersprache ist die beliebteste?
C# ist 2001 erschienen und hat demnach erst 13 Jahre auf dem Buckel. C# durchlebt genau wie das .NET Framework Versionen. Aktuell ist die Version 5.0. Tabelle 1 zeigt Versionen und neue Funktionen, die damit eingeführt wurden.
Tabelle 1: Übersicht über alle C# Versionen
IEnumerable als params
Ein schon älteres Konzept in C# ist das Schlüsselwort params. params führt dazu, dass eine Methode beliebig viele Parameter haben kann und es somit unendlich viele Möglichkeiten gibt, die Methode aufzurufen. Das Ganze funktioniert nur mit Arrays, das bedeutet der Datentyp der mit params markiert ist muss ein Array sein.
In unserem kleinen Beispiel sieht man, dass man diese Methode mit beliebig vielen Parametern aufrufen kann oder auch mit gar keinem. Die Anzahl der Parameter verändern die Größe des Arrays das mit foreach abgearbeitet werden kann.
public int AddParams(params int[] numbers)
{
int sum = 0;
foreach (var number in numbers)
sum += number;
return sum;
}
Intellisense zeigt die Zahlen als params-Array an. Das Problem an diesem Aufbau ist, dass in C# sehr stark die funktionale Programmierung eingezogen ist, und Technologien wie LINQ zum Beispiel auf keine Arrays aufbauen sondern auf dem primitiven Interface IEnumerable. Mit C# 6.0 soll es möglich sein, dass man das Schlüsselwort params mit einem IEnumerable koppelt. Dadurch erhält man vor allem in Bezug auf die funktionale Programmierung einen enormen Vorteil: Bei einem IEnumerable muss die Menge dahinter nicht vollständig materialisiert sein - also im Speicher liegen - sondern kann einfach nur durchiteriert werden. Eintrag für Eintrag, Stück für Stück.
Inline-Deklaration von out-Parametern
Manch ein Entwickler programmiert gerne Methoden die mit out einen oder mehrere zusätzliche Ausgabeparameter haben. Grundsätzlich ist es mit C# ein Leichtes, damit Methoden zu programmieren die mehrere Rückgabewerte haben. Listing 2 zeigt das vorherige Beispiel adaptiert. Es liefert zusätzlich noch den Durchschnitt der Zahlenreihe nach außen.
public int AddParams(out double average, params int[] numbers)
{
int sum = 0;
foreach (var number in numbers)
sum += number;
average = sum / numbers.Length;
return sum;
}
//Verwendung:
double avg;
int sum = ground.AddParams(out avg, 1, 2, 3, 4, 5);
Listing 2: out-Parameter verwenden
int sum = ground.AddParams(out double avg, 1, 2, 3, 4, 5);
Listing 3: out-Parameter verwenden
Monadic null checking
Sauber programmierter Code sollte auf alle Eventualitäten prüfen. Das bedeutet aber, dass jeder Parameter und jedes Property, das man verwenden möchte, muss auf ungleich Null geprüft werden. Das kann dann schon Mal in viel Tippaufwand ausarten:
public int GetFirstItem(IEnumerable<Person> persons)
{
if(persons != null)
{
var person = persons.FirstOrDefault();
if(person != null)
{
if(person.Number != null)
{
return person.Number.Value;
}
}
}
return 0;
}
Listing 4: if-Verschachtelung um eine Null-Reference-Exception auszuschließen
Das kann mittels Monaden nun gelöst werden und verkürzt die gesamte Schreibweise enorm.
public int GetFirstItem(IEnumerable<Person> persons)
{
return persons?.FirstOrDefault()?.Number?.Value ?? 0
}
Listing 5: Monadic-Null-Checking erlaubt eine deutlich kürzere Schreibweise
Das ist ein Feature, das von dem ein oder anderen Programmierer schon lange gewünscht wurde. Auf UserVoice gab es dafür sogar lange Zeit einen eigenen Eintrag und steht mit knapp 4000 Votes an zweiter Stelle in der Rangliste der Most Wanted in der Programmiersprache C#.
Constructor type parameter inference
Wollen Sie eine generische Klasse instanzieren, müssen Sie die Typen immer explizit angeben. Mit C# 6.0 soll der Compiler von den Parametern im Konstruktor die Typen implizit ableiten können. Damit entfällt deren explizite Angabe. Das bedeutet statt wie bisher
var x = new Tuple<int, int>(1, 2);
kann mit C# 6.0 folgender Syntax gewählt werden
var x = new Tuple(1, 2);
Method und Property Expressions
Funktionale Programmierung mit Lambda Expressions ist seit Linq ein Begleiter für jeden Programmierer in der .NET-Welt. Mit C# 6.0 soll es möglich sein, dass sogar Properties und Methoden per Expression definiert werden. Das bedeutet in diesem Falle, dass man statt wie bisher
public string Name { get { return Vorname + " " + Nachname; } }
dies per Expression zu definieren. Daraus wird
public string Name => { Vorname + " " + Nachname };
Dasselbe wird auch bei Methoden möglich sein:
public TimeSpan CalculateAge() => { return DateTime.Today - Birthday; };
Meiner Meinung nach, wird in diesem Falle die Schreibweise nicht erheblich verkürzt, außer dass das Lambda-Pfeilchen Einzug hält.
Statische Typen mit using einbinden
Sollte eine statische Klasse per using eingebunden werden, so wird es nun ermöglicht, dass alle Methoden von dieser Klasse direkt verwendet werden können ohne, dass die Klasse angegeben werden muss. Dementsprechend wird die bisherige Schreibweise
public int GetMin(int x, int y)
{
return Math.Min(x,y);
}
verkürzt
using System.Math; //Statische Klasse
//
public int GetMin(int x, int y)
{
return Min(x,y);
}
Ob dies der Lesbarkeit weiterhilft, bezweifle ich allerdings, da in diesem Fall der Bezug zur statischen Klasse leider fehlt.
Primärer Konstruktor und schreibgeschützte Auto Properties
Ein schreibgeschütztes Property ist in C# schon lange keine Hexerei mehr. Es geht darum, dass eine Eigenschaft jederzeit abgerufen werden kann, aber nur einmalig gesetzt wird (im Konstruktor). Bis jetzt musste dafür folgende Schreibweise verwendet werden:
class Person
{
private readonly DateTime _birthDate;
public DateTime BirthDate { get { return _birthDate; } }
public Person(DateTime birhtDate)
{
_birthDate = birthDate;
}
}
Listing 6: Bisherige Schreibweise für read-only properties.
Dies wird verkürzt, indem direkt geschrieben werden kann
class Person(DateTime birthDate)
{
public DateTime BirthDate { get; } = birthDate;
}
Listing 7: Direkte Definition eines primären Konstruktors und Read-Only-Properties
Für mich noch nicht klar ist in diesem Falle, wie zwischen primärem Konstruktor und weiteren Konstruktoren mit Überladungen unterschieden wird.
Exception Filters
Eine weitere Spekulation findet sich unter http://weblogs.thinktecture.com/cnagel/2014/01/a-happy-new-year-2014.html - Exception Filters. Unter VB.NET gibt es diese schon.
Try
'Try
Catch ex As Exception When DateTime.Now.Ticks Mod 2 = 0
'Catch ... vielleicht :-)
End Try
Hier können beim Exception-Handling Bedingungen in Form von boolschen Ausdrücken für Exceptions angegeben werden. Dieses Feature soll auch mit C# 6.0 möglich sein. Eine genaue Schreibweise/Syntax hierfür war aber nicht zu finden.
Fazit
Man sieht anhand der genannten Beispiele, dass viel funktionale Programmierung in die Programmiersprache einziehen wird. Dieser Artikel fasst zusammen, welche Features möglicherweise in die nächste Version von C# wandern werden. Garantieren kann dies nur Microsoft. Das ein oder andere Feature ist mit etwas Überlegung auch durchaus interessant in der Nutzung. Was halten Sie von den Neuerungen? Teilen Sie sie uns per Twitter @giessweinweb oder @dotnetpro_mag mit.