Was ist neu in C# 6.0
C# 6.0, das mit Visual Studio 2015 ausgeliefert wurde, enthält einen Compiler der neuen Generation, der komplett in C# geschrieben wurde. Der neue Compiler, der unter dem Namen "Roslyn" bekannt ist, stellt die gesamte Compiler-Pipeline über Bibliotheken zur Verfügung und ermöglicht so die Codeanalyse von beliebigem Quellcode. Der Compiler selbst ist quelloffen, und der Quellcode ist unter https://github.com/dotnet/roslyn verfügbar .
Darüber hinaus bietet C# 6.0 einige kleinere, aber wichtige Verbesserungen, die vor allem darauf abzielen, den Code zu entschlacken.
Der Null-Bedingungsoperator ("Elvis") (siehe "Null-Operatoren") verhindert, dass vor dem Aufruf einer Methode oder dem Zugriff auf ein Typmitglied explizit auf Null geprüft werden muss. Im folgenden Beispiel wird result
als Null ausgewertet, anstatt eine NullReferenceException
auszulösen:
System.Text.StringBuilder sb = null;
string result = sb?.ToString(); // result is null
Funktionen in Form von Ausdrücken (siehe "Methoden") ermöglichen es, Methoden, Eigenschaften, Operatoren und Indexer, die einen einzigen Ausdruck bilden, im Stil eines Lambda-Ausdrucks zu schreiben:
public int TimesTwo (int x) => x * 2;
public string SomeProperty => "Property value";
MitEigenschaftsinitialisierern(Kapitel 3) kannst du einer automatischen Eigenschaft einen Anfangswert zuweisen:
public DateTime TimeCreated { get; set; } = DateTime.Now;
Initialisierte Eigenschaften können auch schreibgeschützt sein:
public DateTime TimeCreated { get; } = DateTime.Now;
Schreibgeschützte Eigenschaften können auch im Konstruktor gesetzt werden, was es einfacher macht, unveränderliche (schreibgeschützte) Typen zu erstellen.
Index-Initialisierer(Kapitel 4) ermöglichen die Initialisierung eines jeden Typs, der einen Indexer bereitstellt, in einem einzigen Schritt:
var dict = new Dictionary<int,string>()
{
[3] = "three",
[10] = "ten"
};
DieString-Interpolation (siehe "String-Typ") bietet eine prägnante Alternative zu string.Format
:
string s = $"It is {DateTime.Now.DayOfWeek} today";
MitAusnahmefiltern (siehe "try-Anweisungen und Ausnahmen") kannst du eine Bedingung auf einen Catch-Block anwenden:
string html;
try
{
html = await new HttpClient().GetStringAsync ("http://asef");
}
catch (WebException ex) when (ex.Status == WebExceptionStatus.Timeout)
{
...
}
Mit der Direktive using static
(siehe "Namensräume") kannst du alle statischen Mitglieder eines Typs importieren, so dass du diese Mitglieder unqualifiziert verwenden kannst:
using static System.Console;
...
WriteLine ("Hello, world"); // WriteLine instead of Console.WriteLine
Der nameof
(Kapitel 3) Operator gibt den Namen einer Variablen, eines Typs oder eines anderen Symbols als String zurück. Dadurch wird vermieden, dass der Code unterbrochen wird, wenn du ein Symbol in Visual Studio umbenennst:
int capacity = 123;
string x = nameof (capacity); // x is "capacity"
string y = nameof (Uri.Host); // y is "Host"
Und schließlich ist es dir jetzt erlaubt, await
innerhalb von catch
und finally
Blöcken zu verwenden.