Die nächste große Version von C# ist C# 8.0. Es ist schon seit geraumer Zeit in Arbeit, auch wenn Microsoft die Minor-Releases C# 7.1, 7.2 und 7.3 gebaut und ausgeliefert hat, und ich bin sehr gespannt auf die neuen Möglichkeiten, die es bringen wird.

Die nächste große Version von C# ist C# 8.0.

Der aktuelle Plan ist, dass C# 8.0 gleichzeitig mit .NET Core 3.0 ausgeliefert wird. Die Funktionen werden jedoch mit den Vorschauen von Visual Studio 2019, an denen Microsoft arbeitet, lebendig werden. Wenn diese herauskommen wird es eine ganze Menge mehr Details über die einzelnen Funktionen geben. Das Ziel dieses Beitrags ist es, einen Überblick darüber zu geben, was erwartet werden kann.

Hier ist ein Überblick über die wichtigsten Funktionen, die für C# 8.0 vorgesehen sind. Es gibt auch eine Reihe kleinerer Verbesserungen in den Arbeiten, die in den kommenden Monaten zum Tragen kommen werden.

Nullable reference types

Der Zweck dieses Features ist es, dazu beizutragen, die allgegenwärtigen Nullreferenzausnahmen zu verhindern, die die objektorientierte Programmierung seit einem halben Jahrhundert durchbrechen.

Es hindert jeden daran, Null in gewöhnliche Referenzarten wie Zeichenketten einzufügen – es macht diese Typen nicht nullierbar! Dies geschieht sanft, mit Warnungen, nicht mit Fehlern. Aber auf vorhandenem Code gibt es neue Warnungen, so dass man sich für die Nutzung der Funktion entscheiden muss (was Sie auf Projekt-, Datei- oder sogar Quellzeilenebene tun können).

Async-Streams

Mit der Async/Await-Funktion von C# 5.0 können asynchrone Ergebnisse in einfachem Code ohne Rückruf konsumiert werden.

Bereiche und Indizes

Microsoft fügt einen Typ Index hinzu, der für die Indexierung verwendet werden kann. Man kann ein Int erstellen, das vom Anfang an zählt, oder mit einem Präfix ^-Operator, der vom Ende an zählt:

Index i1 = 3; // number 3 from beginning 
Index i2 = ^4; // number 4 from end 
int[] a = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; 
Console.WriteLine($"{a[i1]}, {a[i2]}"); // "3, 6"

Standardimplementierungen von Schnittstellenelementen

Heute, wenn man ein Interface veröffentlicht, ist das Spiel vorbei: Man kann keine Mitglieder hinzufügen, ohne alle bestehenden Implementierer zu unterbrechen.

In C# 8.0 können Sie einen Body für ein Interface-Mitglied bereitstellen. Wenn also jemand dieses Mitglied nicht implementiert (vielleicht weil es noch nicht da war, als er den Code geschrieben hat), erhält er stattdessen nur die Standardimplementierung.

Recursive patterns

IEnumerable<string> GetEnrollees() 
{ 
foreach (var p in People) 
{ 
if (p is Student { Graduated: false, Name: string name }) yield return name; 
} 
}

Das Muster Student { Graduated: false, Name: string name } prüft, ob die Person ein Student ist, wendet dann das konstante Muster false auf ihre Graduated-Eigenschaft an, um zu sehen, ob sie noch eingeschrieben sind, und das Muster string name auf ihre Name-Eigenschaft, um ihren Namen zu erhalten (wenn nicht null). Wenn p also ein Student ist, keinen Abschluss hat und einen nicht-null Namen hat, geben wir diesen Namen zurück.

Switch expressions

Switch-Anweisungen mit Patterns sind in C# 7.0 recht mächtig, können aber schwer zu schreiben sein. Switch-Ausdrücke sind eine „leichte“ Version, bei der alle Fälle Ausdrücke sind:

var area = figure switch 
{
Line _ => 0,
Rectangle r => r.Width * r.Height,
Circle c => Math.PI * c.Radius * c.Radius,
_ => throw new UnknownFigureException(figure)
};

Target-typed new-expressions

In vielen Fällen, wenn Sie ein neues Objekt erstellen, ist der Typ bereits aus dem Kontext angegeben. In solchen Situationen lassen wir Sie den Typ weglassen:

Point[] ps = { new (1, 4), new (3,-2), new (9, 5) }; // all Points

 

Quelle: https://blogs.msdn.microsoft.com/dotnet/2018/11/12/building-c-8-0/