Die heutige PDC 2008 Session von Anders Hejlsberg “The Future of C#” gab einen Einblick in die kommende Version von C# 4.0, das mit dem .NET Framework 4.0 verfügbar sein wird. Wenn man einem C# Release ein Thema zuordnen möchte, dann war das bei C# 3.0 LINQ. Für C# 4.0 ist es Dynamische Sprache. Richtig gelesen. C# bekommt eine Reihe von dynamischen Elementen. Unter anderem wird C# auch auf die Dynamic Language Runtime zugreifen, die eine Erweiterung der Common Language Runtime ist.

C# ist und bleibt eine stark typisierte Sprache. Es gibt jedoch die Notwendigkeit an der ein oder anderen Stelle dynamische Elemente einzuführen. Ein Beispiel: Um aus einer Silverlight 2 Anwendung heraus auf JavaScript Elemente zuzugreifen, hat man die entsprechenden Methoden und Eigenschaften über Literale in Funktionen gesetzt, z.B.

   1: obj.Invoke(“MethodDoSomething”);

Ein weiteres Beispiel kommt aus dem COM Interop Bereich. Um aus C# heraus Excel zu automatisieren schreibt man zum Teil viele umständliche Zuweisungen und der Code ist nicht mehr gut lesbar, z.B.

   1: ((Excel.Range)excel.Cells[1, 1]).Value2 = "Hello";

Mit C# 4.0 wird das deutlich einfacher.

Dynamic Lookup

Mit Dynamic Lookup erhält man eine Reihe von Funktionalitäten um auf verschiedenste Objekte und Strukturen zuzugreifen, die nicht zwangsläufig .NET Klassen sein müssen. Es wird für verschiedene Technologien entsprechende “Binder” geben, die dafür sorgen, dass der dynamisch deklarierte Funktionsaufruf korrekt umgesetzt wird. “Binder” wird es für .NET, JavaScript, Python, Ruby und COM out-of-the-box geben.

Wie funktioniert nun die Deklaration eines dynamischen Typen? Es gibt ein neues Keyword: dynamic.

Nehmen wir das Silverlight Beispiel von oben. Statt

   1: obj.Invoke(“MethodDoSomething”);

zu schreiben, benutzt man nun das neue Keyword dynamic

   1: dynamic obj = GetSilverlightPage();
   2: obj.MethodDoSomething(); // Die Prüfung erfolgt nun zur Laufzeit
   3:  

Auch das Excel Beispiel von oben lässt sich entsprechend vereinfachen:

   1: excel.Cells[1, 1].Value = "Hello";

Die entsprechende Umwandlung in die einzelnen Methodenaufrufe übernimmt die Laufzeitumgebung.

Die Anwendungsszenarien sind vielfältig. Mit dynamic definiert man also einen eigenen dynamischen Typen. Dynamische Typen können auf statische Typen entsprechend zugewiesen werden. Man kann auch eigene Dynamische Typen erstellen in dem man IDynamicObject implementiert bzw. die Basisklasse DynamicObject. Damit ließe sich zum Beispiel ein PropertyBag erstellen, welcher sich durch die Zuweisung von Eigenschaften selbst definiert und entsprechend füllt.

   1: public class MyBag : DynamicObject
   2: {
   3:     // überschreibt Getter / Setter
   4: }
   5:  
   6: dynamic b = new MyBag();
   7: b.Id = 124;
   8: b.Name = "Windows 7"
   9: b.Price = 499.99m;
  10: b.IsAvailable = false;

Der Code definiert nun das PropertyBag mit den entsprechenden Key/Value Paaren die intern in ein Dictionary abgelegt werden. Man muss nicht b.Add(“Id”, 124); schreiben sondern macht eine Zuweisung und erstellt damit implizit die Struktur der Klasse.

Named und Optionale Parameter

Da hat man schlichtweg die Visual Basic Idee aufgegriffen und es hat nun endlich den Einzug in C# gefunden. Bisher musste man diverse überladene Funktionsdeklarationen schreiben um verschiedene Default Werte anbieten zu wollen, z.B.

   1: public void InsertCustomer( int customerId, string companyName, decimal creditLimit )
   2: {
   3:     // eigentliche Implementierung
   4: }
   5:  
   6: public void InsertCustomer( int customerId, string companyName )
   7: {
   8:     // ruft mit Default creditLimit auf
   9: }
  10:  
  11: public void InsertCustomer( int customerId )
  12: {
  13:     // ruft mit Default companyName und creditLimit auf
  14: }

Das lässt sich nun ganz einfach in einer Funktion abbilden.

   1: public void InsertCustomer( int customerId,
   2:                             string companyName = "Neue Firma",
   3:                             decimal creditLimit = 2000m )
   4: {
   5: }

Zusätzlich können noch Funktionen über “Named” Parameter aufgerufen werden. Hierbei ist die Reihenfolge nicht wichtig, solange die Parameter ohne Default Werte angegeben sind, bzw. in irgendeiner Form im Kontext des Methodenaufrufs als “Named” Parameter übergeben sind, zum Beispiel:

   1: InsertCustomer( 1, creditLimit: 2000m );
   2:  
   3: // was auch geht...
   4: InsertCustomer( creditLimit: 2000m, customerId: 1 );

C# 4.0 bringt noch eine Reihe weiterer Verbesserungen mit sich. Das ganze kann man bereits Nachlesen. Unter http://code.msdn.microsoft.com/csharpfuture gibt es ein entsprechendes Whitepaper das Beschreibt wie die Pläne für C# 4.0 sind. Beispiele lassen sich ebenfalls auf der Seite finden.