CSharp 5.0 (C# 5.0)
Eintrag zuletzt aktualisiert am: 24.05.2022
Die Verison 5.0 von C# ist im
.NET Framework 4.5 enthalten und wird von
Visual Studio 2012 unterstützt.
Es gibt zwei neue Features:
1. vereinfachtes asynchrones Programmieren mit async/
await
2.
Caller Info Attributes
Vereinfachtes asynchrones Programmieren mit async/await
Auf Basis der in
.NET 4.0 eingeführten
Task Parallel Library (
TPL) bietet Microsoft ein neues, sprachunterstütztes Pattern für asynchrones Programmieren in .NET. Eine
Methode kann mit dem neuen Schlüsselwort async (C#) bzw. Async (Visual Basic) deklarieren, dass sie plant, im Laufe ihrer Ausführung die Kontrolle an den Aufrufer zurückzugeben. Eine solche asynchrone
Methode kann ein Task-
Objekt (aus der
TPL) oder nichts zurückliefern. Die
Methode sollte aber auf das Wort "async" enden. Innerhalb der asynchronen
Methode wird die Kontrolle dann genau nach dem ebenfalls neuen Schlüsselwort Await bzw.
await an den Aufrufer zurückgegeben. Await bezieht sich immer auf ein Task-
Objekt, das man entweder selbst erzeugt hat oder von einer anderen asynchronen
Methode stammt.
Listing 1 zeigt ein Beispiel, indem zunächst ein asynchroner HTTP-Download gestartet wird und dann eine einfache Warteanzeige (Ausgabe von Punkten) ausgibt, die ebenfalls asynchron läuft. Der HTTP-Download basiert auf der neuen
Methode GetAsync() in der neuen Klasse
System.Net.Http.HttpClient. Die Warteanzeige verwendet einen selbsterstellten Task. Durch Drücken einer Taste kann man die Konsolenanwendung jederzeit beenden. Im diesem Stil sollen zahlreiche Klassen in der .NET-Klassenbibliothek (z.B.
System.IO und
System.Data) neue asynchrone
Methoden erhalten. In der aktuell verfügbaren Preview-Version ist dies aber noch nicht komplett umgesetzt.
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hauptprogramm Start");
DownloadAsync();
Console.WriteLine("Warten auf Tastendruck");
WarteAnzeige();
Console.ReadLine();
Console.WriteLine("Hauptprogramm Ende");
}
/// <summary>
/// Asynchroner Download (Rückgabe: nichts)
/// </summary>
static private async void DownloadAsync()
{
Console.WriteLine("DownloadAsync() - Schritt 1");
Task<byte[]> task = GetHttpAsync(new Uri("
http://www.IT-Visions.de"));
Console.WriteLine("DownloadAsync() - Schritt 2");
byte[] ergebnis =
await task;
Console.WriteLine("DownloadAsync() - Schritt 3");
Console.WriteLine("DownloadAsync() - Ergebnis: " + ergebnis.Length + " Bytes empfangen");
}
/// <summary>
/// Asynchroner Download (Rückgabe: Task<T></T>)
/// </summary>
static private async Task<byte[]> GetHttpAsync(Uri current
URI)
{
Console.WriteLine("GetHttpAsync() - Schritt 1.
URL = " + current
URI);
HttpClient client = new HttpClient() { MaxResponseContentBufferSize = 1000000 };
Console.WriteLine("GetHttpAsync() - Schritt 2.
URL = " + current
URI);
HttpResponseMessage httpRM =
await client.GetAsync(current
URI);
Console.WriteLine("GetHttpAsync() - Schritt 3.
URL = " + current
URI);
return httpRM.Content.ReadAsByteArray();
}
/// <summary>
/// Warteanzeige mit eigenem Task-
Objekt
/// </summary>
static private async Task WarteAnzeige()
{
var t = new Task(() => Print(10));
t.Start();
await t;
}
/// <summary>
///
Methode für Task in WarteAnzeige()
/// </summary>
static private void Print(int Anzahl)
{
for (int I = 0; I < Anzahl; i++)
{
Console.Write(".");
System.Threading.Thread.Sleep(100);
}
}
}
Listing 1: Asynchrones Programmieren in
.NET 4.0
Als weitere Möglichkeit bieten der C# 5.0- und
VB 11.0-
Compiler sogenannte
Caller Info Attributes ([CallerFilePath]
[CallerLineNumber], [CallerMemberName]), mit denen man
Methodenparameter annotieren kann. Dadurch erhält die gerufene
Methode Informationen über den Aufrufer (vgl.
_FILE__ und __LINE_ in C++).
Visual Basic wird noch ebenbürtiger zu C# durch die Übernahme der Schlüsselwörter Global (zur Namensraumfestlegung) und Yield (zur
Iterator-Implementierung). Auch die Call Hierarchy-Ansicht in der
Entwicklungsumgebung, die in
Visual Studio 2010 für C# eingeführt wurde, gibt es nun für Visual Basic.