Tipps und Tricks rund um .NET und Visual Studio

C# 6.0 und Visual Basic 14 in älteren .NET-Projekten
Keine Kommentare

Dr. Holger Schwichtenberg (MVP) teilt in der Kolumne „.NETversum“ sein Expertenwissen rund um .NET-Tools und WPF mit. Im heutigen Teil der Kolumne lesen Sie unter anderem, wie sie C# 6.0 und Visual Basic 14 in älteren .NET-Projekten nutzen.

C# 6.0 und Visual Basic 14 in älteren .NET-Projekten nutzen

Microsoft hat in den Programmiersprachversionen C# 6.0 und Visual Basic 14, die mit .NET Framework 4.6 ausgeliefert werden, einige syntaktische Zuckerstückchen ergänzt, z. B.:

  • Automatische Properties mit Zuweisung
  • Read-Only Automatic Properties
  • Null-Propagating Operator ?.
  • Operator nameof
  • String-Interpolation

Nicht alle .NET-Softwareentwickler können aber sofort auf .NET Framework 4.6 umsteigen. Die gute Nachricht: Fast alle neuen C#-6.0-/Visual-Basic-14-Sprachfeatures laufen auch in älteren .NET-Versionen – bis hinunter zu .NET 2.0.

Voraussetzung ist nur, dass eine Kompilierung mit Visual Studio 2015 erfolgt. Der dort enthaltene neue C#-/Visual-Basic-Sprachcompiler setzt im Rahmen der .NET Compiler Platform Roslyn die neuen Sprachbefehle in Intermediate Language (IL) um, die kompatibel zu allen .NET-Versionen ab .NET 2.0 ist. Zudem brauchen fast alle neuen Sprachfeatures keine Klassen aus der .NET-Klassenbibliothek, die es nicht auch in .NET 2.0 schon gegeben hat.

Ein C#-6.0-Sprachfeature erfordert aber zumindest .NET Framework Version 4.5: das Schlüsselwort await in Catch- und Finally-Blöcken. Die für das Schlüsselwort await notwendigen Klassen gibt es erst ab .NET Framework 4.5.

Einsatz der dynamischen Typisierung in C#

Dynamische Programmiersprachen wie JavaScript und Python haben in den letzten Jahren viel Zulauf bekommen. Diesem Trend kann sich auch C# nicht entziehen und hat in Version 4.0 dynamische Programmierung als Option eingeführt; grundsätzlich bleibt C# aber eine statisch typisierte Programmiersprache.

Dynamische Programmierung erleichtert die Arbeit mit COM-Objekten und die Zusammenarbeit mit dynamischen .NET-Sprachen wie IronPython. Zudem gibt es auch Situationen im Programmieralltag, wo dynamische Programmierung eine willkommene Abkürzung ermöglichen kann.

Um für eine Variable dynamische Typisierung zu erstellen, ist diese mit dem Typ dynamic zu deklarieren. Dies verschiebt die mit dieser Variablen einhergehende Typprüfung auf die Laufzeit. Wird beispielsweise über eine mit dynamic deklarierte Variable eine Methode aufgerufen, erfolgt die Prüfung, ob diese auch vorhanden ist, erst im Zug des Aufrufs zur Laufzeit. Schlägt eine solche Prüfung fehl, wird dies mit einer RuntimeBinderException angezeigt.

Listing 1 demonstriert den Einsatz des Schlüsselworts dynamic. Die Klassen Kunde und Lieferant besitzen keine gemeinsame Basisklasse, aber eine ähnliche Struktur: Beide haben jeweils ein Property Name und Ort.

Die Liste Adressen besteht aus Instanzen von Kunde und Lieferant. Die Herausforderung besteht nun darin, den richtigen Typ für die Laufvariable einer Schleife über alle Objekte in der Liste zu wählen. Es gibt keine gemeinsame Basisklasse, die hier als Typ herhalten könnte. Eine Deklaration auf System.Object geht auch nicht. Der Compiler meckert: „’object‘ does not contain a definition for ‚Name‘ and no extension method ‚Name‘ accepting a first argument of type ‚object‘ could be found (are you missing a using directive or an assembly reference?)“. Hier ist die Verwendung von dynamic geboten. Früher hätte man hier umständlich via Reflektion die Eigenschaften aufrufen müssen.

public class Kunde
{
  public string Name;
  public string Ort;
  public double Umsatz;
}

public class Lieferant
{
  public string Name;
  public string Ort;
  public List<string> Produkte;
}

class DynamicDemo
{

  public static void Run()
  {
  	Kunde k1 = new Kunde() { Name = "Meier", Ort = "Zürich", Umsatz = 10000.00f };
 	Kunde k2 = new Kunde() { Name = "Müller", Ort = "Berlin", Umsatz = 20000.00f };
  	Lieferant l1 = new Lieferant() { Name = "Schulze", Ort = "Hamburg", Produkte = new List<string> { "Software", "Hardware" } };

  	ArrayList Adressen = new ArrayList() { k1, k2, l1 };

  	foreach (dynamic d in Adressen)
  	{
   		Console.WriteLine(d.Name + " aus " + d.Ort);
    		if (d is Kunde) Console.WriteLine("  Kunde mit Umsatz: " + d.Umsatz.ToString());
    		if (d is Lieferant) Console.WriteLine("  Lieferant mit Produkten: " + String.Join(" ", d.Produkte.ToArray()));
  	}
 }
}

Tipps

  1. Dynamische Programmierung ist langsamer als statische Programmierung.
  2. Am besten wäre es natürlich, in obigem Beispiel eine gemeinsame Basisklasse oder eine Schnittstelle zu schaffen, die beide Klassen bei der Deklaration verwenden. Aber es gibt eben in der Praxis Fälle, wo das nicht möglich ist, z. B. weil eine der beiden Klassen nur in kompilierter Form vorliegt.

String-Interpolation in C# 6.0 und Visual Basic 14

Die String-Interpolation gehört zu den syntaktischen Zuckerstücken in C# 6.0 und Visual Basic 14. Durch Voranstellen des Dollarzeichens $ vor eine Zeichenkette kann man anstelle der nachgestellten Parameterliste bei String.Format() die einzelne Ausdrücke direkt in die geschweiften Klammern schreiben. Formatierungsausdrücke sind weiterhin möglich.

var ausgabeAlt = String.Format("Kunde #{0:0000}: {1} ist in der Liste seit {2:d}.", k.ID, k.GanzerName, k.ErzeugtAm);
var ausgabeNeu = $"Kunde #{k.ID:0000}: {k.GanzerName} ist in der Liste seit {k.ErzeugtAm:d}.";

Bei Verwendung des bedingten Operators …. ? … : … sind zusätzliche runde Klammern vor und nach dem Ausdruck notwendig, um eine Verwechslung mit einem Formatierungsausdruck zu vermeiden.

Console.WriteLine($"Stammkunde: {(stammkunde ? "Ja" : "Nein")}");

Eine Kombination mit dem „Verbatim String“-Zeichen @ ist möglich, allerdings muss die Reihenfolge $@“…“ verwendet werden. @$“…“ ist nicht erlaubt.

// Kombination $ und @
var kundenordner1 = String.Format($@"d:\Daten\Kunden\{k.ID:0000}");
// nicht erlaubt: var kundenordner2 = String.Format(@$"d:\Daten\Kunden\{k.ID:0000}");

Buchempfehlungdotnet_praxis

In den vergangenen Jahren haben Dr. Holger Schwichtenberg und Manfred Steyer im „Windows Developer“ regelmäßig Tipps und Tricks aus ihrem Alltag als Softwareentwickler, Berater und Trainer für .NET- und webbasierte Anwendungen veröffentlicht. Das vorliegende Buch ist eine aktualisierte und deutlich erweiterte Zusammenfassung dieser Tipps und Tricks. Es umfasst sowohl das .NET Framework und seine zahlreichen Teilbibliotheken als auch die beliebte JavaScript-Bibliothek AngularJS sowie die Entwicklungsumgebung Visual Studio und ergänzende Werkzeuge.

Mehr Infos: www.entwickler-press.de/Dotnet-Praxis

Windows Developer

Windows DeveloperDieser Artikel ist im Windows Developer erschienen. Windows Developer informiert umfassend und herstellerneutral über neue Trends und Möglichkeiten der Software- und Systementwicklung rund um Microsoft-Technologien.

Natürlich können Sie den Windows Developer über den entwickler.kiosk auch digital im Browser oder auf Ihren Android- und iOS-Devices lesen. In unserem Shop ist der Windows Developer ferner im Abonnement oder als Einzelheft erhältlich.

Unsere Redaktion empfiehlt:

Relevante Beiträge

Hinterlasse einen Kommentar

Hinterlasse den ersten Kommentar!

avatar
400
  Subscribe  
Benachrichtige mich zu:
X
- Gib Deinen Standort ein -
- or -