Verwirft und das Verwerfenmuster

Tip

Dieser Artikel ist Teil des Abschnitts "Grundlagen" für Entwickler, die bereits mindestens eine Programmiersprache kennen und C# erlernen. Wenn Sie mit Mustern noch nicht vertraut sind, beginnen Sie mit der Übersicht über den Musterabgleich. Vollständige Syntax finden Sie in der Verwerfen-Musterreferenz.

Das Unterstrichtoken (_) kommuniziert, dass kein Wert erforderlich ist. Die genaue Bedeutung hängt davon ab, wo sie angezeigt wird:

Kontext Bedeutung von _
Ein Schalterausdrucksarm oder ein geschachteltes Muster Ein Verwerfenmuster , das ohne Erfassen des Ergebnisses übereinstimmt
Eine Dekonstruktion oder out ein Argument Ein Verwerfen , der einen erzeugten Wert ignoriert
Eine Aufgabe, z. B. _ = expression Eine Wegwerfzuweisung, die den Ausdruck auswertet und das Ergebnis ignoriert.
Zwei oder mehr Lambda-Parameter mit dem Namen _ Parameter verwerfen, deren Eingaben nicht verwendet werden
var _ in einem Muster Ein var Muster mit einer Verwerfenbezeichnung

Diese Formulare teilen Rechtschreibung und Absicht, sind aber nicht austauschbar.

Musterabgleich mit switch

Im folgenden Beispiel ist statusCode ein int. Jeder Schalterarm erzeugt eine string Meldung, die das Programm in die Konsole schreibt. Der letzte _ behandelt jeden anderen Statuscode als 200 und 404:

static void ShowStatus()
{
    int statusCode = 503;
    string message = statusCode switch
    {
        200 => "Ready",
        404 => "Not found",
        _ => "Another status"
    };

    Console.WriteLine(message);
}

Ein Verwerfenmuster wird auf einen Eingabeausdruck angewendet. C# wertet den Ausdruck aus und _ stimmt mit dem ausgewerteten Wert überein, ohne ihn zu erfassen. Wählen Sie _ als abschließenden Arm des switch-Ausdrucks aus, wenn für alle zuvor nicht behandelten Werte dieselbe Rückfalloption verwendet werden soll. Legen Sie sie zuletzt fest, weil sie mit allem übereinstimmt, einschließlich null.

Das Formular var _ ist ein var Muster mit einer Verwerfenbezeichnung. Es entspricht auch jedem ausgewerteten Wert, führt aber keine lesbare Variable ein. Bevorzugen Sie das kürzere _ Verwerfenmuster für einen Switch catch-all. Weitere Informationen zu var Mustern und Bezeichnungen finden Sie unter "Deklaration", "Konstante" und var "Muster".

Destrukturierungsdeklarationen

GetForecast gibt ein Tupel mit vier Komponenten zurück: eine string Stadt und drei int Werte für die Hohe Temperatur, niedrige Temperatur und Regenwahrscheinlichung. Die Dekonstruktionsdeklaration behält city und high bei, weil das Programm sie anzeigt. Für die niedrige Temperatur und die Regenwahrscheinlichkeit wird _ verwendet, da die Benennung dieser nicht verwendeten Komponenten implizieren würde, dass der Code sie benötigt:

static void ShowForecast()
{
    var (city, high, _, _) = GetForecast();
    Console.WriteLine($"{city}: high {high}°C");

    static (string City, int High, int Low, int RainChance) GetForecast() =>
        ("Portland", 18, 9, 40);
}

Dieselbe Verwerfenssyntax funktioniert, wenn die Methode eines Objekts Deconstruct mehrere Werte erzeugt. Zu diesen Formen siehe Deconstructing tuples and other types.

Aufrufe von Methoden mit out Parametern

Angenommen, ein Eingabefeld akzeptiert nur Text, wenn es eine ganze Zahl darstellt. Die TryParse(String, Int32) Methode gibt einen bool Wert zurück, der meldet, ob die Analyse erfolgreich war. Es erzeugt außerdem den geparsten int über seinen out-Parameter. Der folgende Code benötigt nur das boolesche Ergebnis, um die Eingabe zu akzeptieren oder abzulehnen:

static void CheckInput()
{
    string text = "42";

    if (IsWholeNumber(text))
    {
        Console.WriteLine($"Accepted: {text}");
    }
    else
    {
        Console.WriteLine("Enter a whole number.");
    }

    static bool IsWholeNumber(string text) => int.TryParse(text, out _);
}

Verwenden Sie out _, wenn nur der Erfolg des Vorgangs wichtig ist. Das Verwerfen verdeutlicht, dass die geparste Zahl nicht benötigt wird. Wenn späterer Code die Zahl benötigt, geben Sie dem out Argument einen Namen, z out int number. B. , und behalten Sie diesen Wert stattdessen bei.

Eine Verwerfen-Zuweisung , _ = expressionwertet einen Ausdruck aus und ignoriert absichtlich sein Ergebnis. Das ist manchmal nützlich, wenn der Ausdruck ansonsten keine gültige Anweisung ist.

Important

Verwenden Sie _ = Task.Run(...) oder _ = SomeAsyncMethod() nicht, um eine Aufgabe im Anwendungscode zu verwerfen. Warten Sie die Aufgabe, damit derEn Abschluss und Ausnahmen im aufrufenden Fluss verbleiben. Eine Verwerfen-Zuordnung macht eine Aufgabe nicht sicher, beobachtet ihre Ausnahme oder erstellt einen unterstützten Feuer-und-Vergessen-Vorgang.

Nicht verwendete Lambda-Parameter markieren

Ein object? empfängt einen EventHandler Absender und einen EventArgs Wert. Der folgende Handler benötigt keinen Parameter; sie schreibt "Timer tick" nur in die Konsole. Durch das Benennen beider Parameter _ wird ihr nicht verwendeter Status sichtbar, ohne Namen zu erfinden, die der Textkörper niemals verwendet:

static void ShowLambdaDiscards()
{
    EventHandler handler = (_, _) => Console.WriteLine("Timer tick");
    handler(null, EventArgs.Empty);
}

Wählen Sie "Parameter verwerfen", wenn eine Stellvertretungssignatur Eingaben erfordert, die der Lambda-Text nicht verwendet. Wenn eine Lambda-Funktion nur einen Parameter namens _hat, _ bleibt ein normaler Parametername aus Gründen der Abwärtskompatibilität.

Vermeiden _ als Bezeichner

_ kann ein gewöhnlicher Bezeichner in Kontexten sein, bei dem C# keine Verworfene erkennt. Eine in-Bereichsvariable namens _ kann eine Zuordnung empfangen, die wie eine Verworfene Zuordnung aussieht. In einem Musterkontext kann auch eine zugängliche Konstante oder ein zugänglicher Typ namens _ ändern, wie _ interpretiert wird. Vermeiden Sie das Deklarieren eigener Variablen, Konstanten oder Typen mit dem Namen _; verwenden _ Sie zum Kommunizieren der Verworfungsabsicht.

Siehe auch