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:
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"!