posted by: Ralf Rottmann | posted @ Sunday, November 04, 2007 10:12 PM | View blog reactions

Seit etwas über drei Monaten steht die Beta 2 von Visual Studio 2008 (Codename "Oracs") zum freien Download zur Verfügung. Visual Studio bringt mit diesem Major Release wie bisher mit allen vergangenen Releases wesentliche Neuerungen die zur weiteren Erhöhung der Produktivität in der Softwareentwicklung führen werden und wird seinem Ruf als "beste IDE der Welt" mit Sicherheit erneut gerecht.

Spannender jedoch als einzelne neue Features der Integrierten Entwicklungsumgebung sind die Spracherweiterungen in C# (und VB) die ebenfalls unter dem Codenamen "Orcas" bereits jetzt zum großen Teil verfügbar sind, allerdings insbesondere in der deutschen .NET Community bislang relativ wenig Aufmerksamkeit erhalten haben. Ich habe mir deshalb vorgenommen in den nächsten Tagen eine Serie von Blog Posts zu veröffentlichen, die sich mit diesen Erweiterungen auseinandersetzen. Die von mir verwendeten Beispiele werden ausschließlich in C# ausgeführt - fast alle Merkmale werden ebenso für VB zur Verfügung stehen. Meine Beispiele habe ich mit der aktuellen Beta 2 von Visual Studio für das .NET Framework 3.5 kompiliert.


Automatic Properties

Wie viele .NET Entwickler schreibe auch ich nahezu täglich Code zur Anwendung von Properties, der wie folgt aussieht:

 
code

    8     public class Book

    9     {

   10         private string _title;

   11         private string _author;

   12         private int _numberInStock;

   13 

   14         public string Title

   15         {

   16             get { return _title; }

   17             set { _title = value; }

   18         }

   19 

   20         public string Author

   21         {

   22             get { return _author; }

   23             set { _author = value; }

   24         }

   25 

   26         public int NumberInStock

   27         {

   28             get { return _numberInStock; }

   29             set { _numberInStock = value; }

   30         }

   31     }


In diesem Beispiel verwende ich innerhalb der Getter und Setter keine Logik, um beispielsweise Wertebereiche zu validieren - trotzdem ist die Implementierung von Properties gegenüber dem direkten Zugriff auf public fields der Klasse natürlich auch in diesem Fall sinnvoll. Zum einen können Felder nicht für Data Binding genutzt werden, zum anderen würde, falls später eine Validierung (und somit der notwendige Wechsel zur Verwendung von Properties) erforderlich würde, das öffentliche Interface der Klasse eine Neukompilierung aller Assemblies bedeuten, von denen die Klasse genutzt wird.

Der "Orcas" C# Compiler erlaubt es, die Properties wie im oben aufgeführten Beispiel wesentlich eleganter (und kürzer!) zu gestalten:

code

    8     public class Book

    9     {

   10         public string Title

   11         {

   12             get; set;

   13         }

   14 

   15         public string Author

   16         {

   17             get; set;

   18         }

   19 

   20         public int NumberInStock

   21         {

   22             get; set;

   23         }

   24     }

 

Lässt man überflüssige Leerzeichen und Zeilenumbrüche weg, geht es sogar noch kürzer:

code

    8     public class Book

    9     {

   10         public string Title { get; set; }

   11         public string Author { get; set; }

   12         public int NumberInStock { get; set; }

   13     }


Der C# Compiler erzeugt die notwendigen privaten Felder der Klasse automatisch und implementiert die Default-Logik für die Getter und Setter Methoden gleich mit! Das öffentliche Interface der Klasse entspricht exakt dem des ersten Code Beispiels. Wird es später notwendig, Validierungslogik einzufügen, kann dies jederzeit erfolgen, ohne dass abhängiger Programmcode geändert werden muss. (Eine ausführliche Darstellung, wie die Intermediate Language aussieht, die der C# Compiler für Automatic Properties generiert, findet sich in englischer Sprache bei Bart de Smet.)


Object Initializer

Properties gehören zu den Sprachmerkmalen, die bei der Programmierung mit dem .NET Framework häufig angewendet werden. Insbesondere für die Instanziierung von Objekten werden oft Codezeilen wie die folgenden geschrieben:

code

   12             Book book = new Book();

   13             book.Title = "WPF at Talentgroup";

   14             book.Author = "Ralf Rottmann";

   15             book.NumberInStock = 10;


Die neuen Object Initializer Fähigkeiten im C# "Orcas" Compiler erlauben eine elegantere Art eine Objektinstanz zu erzeugen und Werte für Properties zu setzen:

code

    1 Book book = new Book { Title = "WPF at Talentgroup", Author = "Ralf Rottmann", NumberInStock = 10 };

Wiederum erzeugt der C# Compiler die notwendigen Anweisungen für das korrekte Setzen der Properties automatisch. Die Reihenfolge und Anzahl der Properties, denen auf diese Weise Werte zugewiesen werden, ist übrigens frei wählbar. Es ist wichtig zu verstehen, dass die Book-Klasse im obigen Beispiel keinen Constructor implementiert, sondern der C# Compiler semantisch mit dem vorausgehenden Codebeispiel identische IL Statements erzeugt!

Object Initializer erlauben nicht nur das Setzen einfacher Properties, auch komplexe Typen können auf diese Weise initialisiert werden. Würde die Book-Klasse beispielsweise ein Property vom Typ Publisher implementieren, könnte diese Initialisierung erfolgen:

code

   12             Book book = new Book

   13             {

   14                 Title = "WPF at Talentgroup",

   15                 Author = "Ralf Rottmann",

   16                 NumberInStock = 10,

   17                 PublisherInfo = new Publisher

   18                 {

   19                     Name = "Random House",

   20                     City = "Dortmund",

   21                     Zip = 44229

   22                 }

   23             };


Selbstverständlich bietet Visual Studio 2008 für Object Initializer durchgängig IntelliSense Unterstützung:

image


Collection Initializer

Object Initializer sind insbesondere dann hilfreich, wenn Objekte zu Collections hinzugefügt werden sollen. Um beispielsweise drei Bücher zu einer generischen List Collection vom Typ Book hinzuzufügen, reicht der folgende, sehr elegante Code:

code

    1 List<Book> books = new List<Book> ();
    2 books.Add( new Book { Title = "WPF at Talentgroup", Author = "Ralf Rottmann", NumberInStock  = 10} );
    3 books.Add( new Book { Title = "24100.net unleashed", Author = "Ralf Rottmann", NumberInStock = 5 } );
    4 books.Add( new Book { Title = "Silverlight rulez", Author = "Sascha Sigges", NumberInStock = 1 } );

Die Verwendung der Object Initializern alleine spart schon über 10 Codezeilen. Noch einfacher wird es, wenn man zusätzlich Collection Initializer anwendet:

code

    1 List<Book> books = new List<Book> {
    2     new Book { Title = "WPF at Talentgroup", Author = "Ralf Rottmann", NumberInStock  = 10},
    3     new Book { Title = "24100.net unleashed", Author = "Ralf Rottmann", NumberInStock = 5 },
    4     new Book { Title = "Silverlight rulez", Author = "Sascha Sigges", NumberInStock = 1 }
    5 };

Im Ergebnis wird mit deutlich weniger Code semantisch identische Intermediate Language erzeugt, d.h. Klassen in denen die neuen Features genutzt werden, können nachwievor exakt so verwendet werden, wie die deutliche aufwändigere Codierung mit .NET 2.0.

Natürlich hat die Microsoft Developer Division diese Compiler Erweiterungen nicht ausschließlich vorgenommen, damit Entwickler weniger Tipparbeit haben. Hintergrund vieler Erweiterungen ist die Erweiterung von .NET um LINQ. LINQ steht für .NET Language Integrated Query, eine extrem leistungsfähige Erweiterung welche .NET Sprachen um integrierte Möglichkeiten zum Umgang mit Datenquellen anreichert. LINQ abstrahiert dabei, ob es sich bei diesen Datenquellen um Objekte, relationale Datenbanken oder beispielsweise XML Dokumente handelt.

In einem weiteren Artikel werde ich demnächst weitere Erweiterung behandeln, wie zum Beispiel Extension Methods um dann auch ausführlich über LINQ zu berichten.

Bis dahin viel Spaß beim Experimentieren mit dem aktuellen Beta Release von .NET "Orcas"!

 

comments
24100.net stated:
# dotnet
dotnet
posted on 11/5/2007 12:43 AM
post your comment
Title *
Name *
Email
Url
Comment *  
Please add 6 and 4 and type the answer here: