Bei einigen der unter C# 3.0 Spracherweiterungen geführten Dinge handelt es sich mehr um Compilererweiterungen des C# Compilers der mit Visual Studio 2008 ausgeliefert wird, als um echte Spracherweiterungen für C#.
So funktionieren die nachfolgenden Erweiterungen auch dann wenn man Code für das NET Framework 2.0 erzeugt:
- Implizit typisierte lokale Variablen
- Objekt Initialisierer
- Anonyme Typen
- Automatische Eigenschaften
Wenn diese Dinge „Spracherweiterungen“ und nicht „Compilererweiterungen“ wären, dann wäre es nicht möglich ein Programm welches diese Feature verwendet für das NET 2.0 Framework zu erstellen und auf einem Rechner mit „nur“ installiertem NET 2.0 Framework auszuführen.
Hier ein Beispiel, welches ich mit VS2008 als Konsolenanwendung für den Framework 2.0 erstellt habe und auf einem Rechner mit NET 2.0 Framework ausgeführt habe:
class Program { // Automatische Eigenschaften static public double AutoDouble { get; set; } // Klasse zur Verwendung mit Objekt Initialisierung ohne Konstruktoren public class Address { public string Name { get; set; } public string Street { get; set; } public int ZIP { get; set; } public string City { get; set; } public override string ToString() { return this.Name + "," + this.Street + "," + this.ZIP + "," + this.City ; } } static void Main(string[] args) { // Implizit typisierte lokale Variable var i = 10; // Verwendung der Eigenschaft AutoDouble AutoDouble = 12.22; // Anonymer Typ var figur = new { Name = "Rechteck", Breite = 1024, Hoehe = 768 }; // Objekt Initialisierung mit Feldbezeichnungen ohne Konstruktor Address adr = new Address { Name = "Max Musterman", Street = "Platanenweg", ZIP = 4711, City = "Musterhausen" }; // Ausgabe der Werte Console.WriteLine(i.ToString()); Console.WriteLine(AutoDouble.ToString()); Console.WriteLine(String.Format("Die Adresse lautet {0}",adr.ToString())); Console.WriteLine(String.Format("Hier der anonyme Typ figur {0}",figur.ToString())); Console.Read(); } }
Nicht von diesem Beitrag betroffen sind die echten Spracherweiterungen von C# 3.0 wie:
- Erweiterungsmethoden
- Lambda Expressions
- LINQ
Diese erfordern aber das die Programme für das NET 3.5 Framework erstellt werden.
Ich meine hier geht "Sprache" und "Framework" durcheinander.
Ein Compiler übersetzt eine Sprache in eine andere Sprache. In unserem Fall wird C# nach IL übersetzt. Die Spracherweiterungen von C# 3.0 werden vom Compiler in IL übersetzt, ohne dass dazu der Umfang von IL erweitert werden musste. Dennoch bleiben es Spracherweiterungen.
Bei den Spracherweiterungen muss man unterscheiden zwischen solchen die mit dem Framework 2.0 laufen, und solchen die 3.5 benötigen. Deine oben aufgeführten Beispiele laufen mit .NET 2.0, LINQ nicht.