C# 3.0 zuckersüss...
Kaum ist C# in Version 2.0 komplett fertig schon kündigt Microsoft den nächsten Schritt an. Für C# 3.0 zeichnet sich wieder Anders Hejlsberg verantwortlich der die neuen Features auch höchst persönlich an der PDC (Professional Developers Conference) in Los Angeles vorstellte. Er war Chefentwickler bei Borland, massgeblich beteiligt am Erfolg von Turbo Pascal und Delphi, heute ist er für Microsoft als Chefentwickler für C# tätig und mitverantwortlich für die Entstehung von .NET.
Nachdem mit der Version 2.0 generische Typen, Iterator Methoden (yield Anweisung), Anonyme Methoden, partiellen und statischen Klassen Einzug in C# gemacht haben, gibt es auch beim 3.0 Update einige interessante Ideen.
Während C# 2.0, vor allem wegen der Generics, auch die neue Virtual Machine CLR2 (Common Language Runtime 2) brauchte, wird es für .NET dieses mal kein Update geben. Die Veränderungen im Sprachumfang sind also rein syntaktischer Art. Dieser „Syntactic Sugar“ soll das Programmieren aber natürlich vereinfachen, beschleunigen und somit Produktiver machen.
Die Spezifikationen sind im Moment mit rund 25 Seiten noch sehr überschaubar, und wie bei C# bereits bekannt ist das Spezifikationsdokument die Beste Dokumentation zur Sprache.
Implizite Typisierung:
var i = 5 ;
b = new List<Pair<int, string>>();
Der Typ der linken Seite wird aus der rechten Seite abgeleitet. Da besonders die generischen Typen recht lang werden können ist es sehr Sinnvoll hier auf unnötige Doppelnennungen zu verzichten. Wer sich an VB erinnert fühlt irrt, C# ist weiterhin stark typisiert, es gibt keinen var Typ, und ein Deklaration
var b;
b = new List;
wird scheitern da der Compiler den Typ für b nicht bestimmen kann.
Objekt Initialisierer
Um ein Objekt zu erzeugen und dann die Variablen zu setzen verwendete man bisher:
Person p = new Person();
p.Name = "Niek";
p.Active = true;
neu gibt es diese Einfach Syntax:
Person p = new Person { Name = "Niek", Active = true };
ganz hübsch ist auch das man auch Collections auf diese Weise initialisieren kann. Von Arrays sind wir uns die Syntax ja bereits gewohnt:
List<string> animals = new List<string> { "monkey", "donkey", "cow", "dog", "cat" } ;
Anonyme Typen
Richtig interessant wird es nun wenn man die beiden ersten Features miteinander kombiniert.
var x = new { X = 1, Y = 10, P = new Point { X = 5, Y = 5 } };
x hat nun den Typ einer anonymen Klasse (ohne expliziten Namen) mit den Inhalten X, Y und P. Dieses feature ist natürlich besonders wertvoll wenn man mal wieder einfach schnell ein temporäres Objekt erzeugen will damit man mehr als eine Variable zurück liefern kann. Ausserhalb der Funktion kann man dann natürlich ganz einfach über die implizit erzeugten Felder X, Y und P zugreifen.
Man kann sogar mehrere solcher Instanzen kreieren, ohne einen expliziten Namen zu verwenden wird der Compiler allen Instanzen den gleichen Anonymen Typ zuweisen.
Extension Methoden
Manchmal würde man gerne bestimmten Klassen Methoden hinzufügen, doch leider hat man manchmal einfach nicht den Zugang zu den Sourcecodes der entsprechenden Klassen. Dafür gibt es nun „Extension methods“
public static int ToInt32(this string s)
{
return Convert.ToInt32(s) ;
}
string s = "1";
int i = s.ToInt32();
das ganze sieht wie eine ganz normale Methode aus, der einzige unterschied ist das this als modifier für den Typ string übergeben wird. Das heisst das diese Methode für den Typ string funktioniert. Bei Konflikten werden Extension methods nicht berücksichtigt. ToString() für alle Klassen zu überschreiben ist also nicht möglich. Wegen des erheblichen zusätzlichen Aufwands (das suchen und dynamische binden zur Laufzeit) sollte man damit sparsam umgehen speziell wenn es sich um sehr generische Klassen wie etwa object handelt.
Lambda Ausdrücke
Im dritten Semester kriegt man auch heute noch einen Einblick in andere Programmier Paradigmen. Eines davon ist die funktionale Programmierung. Ob SML oder Haskell wir hatten wohl alle unsere Mühe damit. Nun hält die Funktionale Programmierung auch Einzug in C#.
In C# kann man den Lambda Ausdruck
x => x + 1
hinschreiben, und er tut genau das was man erwartet. Man kann damit vor allem im gleich vorgestellten LINQ sehr einfach Filter erzeugen. Es ist hier anzumerken das man hier wieder deutlich sieht das dies nichts wirklich neues ist, aber den Zeitaufwand erheblich reduziert. Die Lambda Ausdrücke könnten auch durch Delegates einfach modeliert werden. Doch wie man im simplen Beispiel oben sieht funktioniert in Lambda Ausdrücken die Ableitung der Typen automatisch. Man kann die Typen explizit angeben, man muss aber nicht.
Die Preview des neuen Compilers hat hier noch einige Schwächen im Moment können noch keine Lambda Ausdrücke mit einem Statement Block gemacht werden, dies wird sicher aber noch ändern und solange muss man noch auf Anonyme Delegates zurückgreifen.
LINQ
LINQ steht für Language INtegrated Query, es steht also um Abfragen von Datenbanken zu machen. Bisher musste man wenn man SQL Queries absetzen wollte auf String übergabe zurück greifen. Das Problem ist das weder die IDE noch der Compiler normalerweise Hilfestellung leisten können, dafür müsste man diese Strings ja erst einmal parsen.
Mit einer stark an SQL angelehnten Syntax kann C# mit LINQ nun direkt auf verschiedenste Datenquellen zurück greifen. Der Ansatz wurde von Microsoft sehr generisch umgesetzt. Man kann LINQ nicht nur auf SQL, XLink und XPath Anfragen absetzen. Nein LINQ kann auch auf irgendwelche Collections angewendet werden. Im Beispiel sieht man wie ein Array missbraucht wird. In LINQ zeigt sich wieder wie praktisch die Lambda Notation ist um zum Beispiel eigene Filter zu bauen.
int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };
var lowNums = from n in numbers where n < 5 select n;
Console.WriteLine("Numbers < 5:");
foreach (var x in lowNums) {
Console.WriteLine(x);
}
So dies war ein Einblick in diese ganz neue Welt. C# hat sich stark entwickelt und geht ganz neue Wege. Bisher sind sie damit sehr gut gefahren und die Neuerungen sehen sehr viel versprechend aus. Vor allem wirkt alles wie aus einem Guss, die Neuerungen Ergänzen sich hervorragend und vergisst dabei fast das dies alles nur „syntactic sugar“ ist. Die Sprache wird Umfangreicher, und manche features werden wahrscheinlich seltener Genutzt werden. Sie gibt dem Programmierer aber die Freiheit seine Ideen in vielfältiger Form umzusetzn.-
Kommentar schreiben