Neue Features in C# 8.0

Neue Features in C# 8.0

10 Sep 2019 - Matthias Voigt

Mit der Veröffentlichung von C# 8.0 und .NET Core 3.0 hat Microsoft eine Reihe spannender neuer Features eingeführt, die Entwicklern helfen, effizienteren und ausdrucksstärkeren Code zu schreiben. In diesem Artikel werde ich einige der wichtigsten Neuerungen in C# 8.0 vorstellen.

Asynchrone Streams

Asynchrone Streams ermöglichen es, Datenströme asynchron zu verarbeiten. Dies ist besonders nützlich für I/O-intensive Anwendungen und Szenarien, in denen Daten schrittweise verarbeitet werden müssen:

public async IAsyncEnumerable<int> GetNumbersAsync()
{
    for (int i = 0; i < 10; i++)
    {
        await Task.Delay(1000); // Simuliert eine asynchrone Operation
        yield return i;
    }
}

Nullable Referenztypen

Nullable Referenztypen helfen, Nullreferenzausnahmen zu vermeiden, indem sie den Entwickler dazu zwingen, explizit anzugeben, ob ein Referenztyp null sein kann oder nicht:

public class Person
{
    public string FirstName { get; set; } = null!;
    public string? MiddleName { get; set; }
    public string LastName { get; set; } = null!;
}

Pattern Matching

C# 8.0 erweitert das Pattern Matching und bietet neue Möglichkeiten, Bedingungen und Muster eleganter zu formulieren:

public static string Classify(object obj) => obj switch
{
    int i when i > 0 => "Positive integer",
    int i when i < 0 => "Negative integer",
    string s => "String",
    _ => "Unknown"
};

Ranges und Indices

Ranges und Indices bieten eine neue Möglichkeit, auf Teile von Arrays, Listen und anderen Sequenzen zuzugreifen:

int[] numbers = { 1, 2, 3, 4, 5 };
int[] subset = numbers[1..4]; // Enthält die Elemente 2, 3 und 4
int lastNumber = numbers[^1]; // Das letzte Element

Default-Implementierungen für Schnittstellen

Mit C# 8.0 können Schnittstellen nun Default-Implementierungen für ihre Mitglieder bereitstellen. Dies ermöglicht es, neue Methoden zu Schnittstellen hinzuzufügen, ohne bestehende Implementierungen zu brechen:

public interface ILogger
{
    void Log(string message);
    
    void LogError(string message)
    {
        Log($"Error: {message}");
    }
}

Using-Deklarationen

Using-Deklarationen bieten eine verkürzte Syntax für die Verwendung des using-Statements und ermöglichen eine einfachere Handhabung von Ressourcen:

using var stream = new FileStream("example.txt", FileMode.Open);

Switch Expressions

Switch Expressions bieten eine kompaktere und ausdrucksstärkere Möglichkeit, Switch-Logik zu implementieren:

public static string GetSeason(Month month) => month switch
{
    Month.December or Month.January or Month.February => "Winter",
    Month.March or Month.April or Month.May => "Spring",
    Month.June or Month.July or Month.August => "Summer",
    Month.September or Month.October or Month.November => "Fall",
    _ => throw new ArgumentOutOfRangeException()
};