Was heisst das?


36

Ich sehe manchmal den folgenden Code und habe keine Ahnung, was der Ausdruck tatsächlich testet.

public static void Something(string[] value)
{
   if (value is { })
   {
      DoSomethingElse();
   }
}

Antworten:


28

Dies ist nur das leere Eigenschaftsmuster in C # 8, dh der Wert nicht null. Es entspricht jedem Werttyp oder Referenztyp. Wie Panagiotis Kanavos in den Kommentaren feststellt, entspricht dies dem guten alten value is objectScheck, der schon lange in C # ist.

Wenn Sie eine Eigenschaft angeben, stimmt diese im Allgemeinen überein oder nicht. Dieses esoterische Beispiel zeigt Folgendes:

if (value is { Length: 2 })
{
   // matches any object that isn't `null` and has a property set to a length of 2
}

Die Eigenschaftsmuster funktionieren am besten und sind am deutlichsten, wenn sie mit anderen Mustern in Fällen wie switchAusdrücken verglichen werden .


1
Was bedeutet in diesem Fall leeres Objekt? leere Schnur, Leerraum?
OlegI

3
@OlegI nein ist es nicht. sist definitiv nicht null. is {}ist eine Abkürzung für is objectund Zeichenfolgen können in Objekte umgewandelt werden.
Panagiotis Kanavos

6
@OlegI wie so? Es ist eine gültige Referenz, damit es übereinstimmt.
Daniel A. White

3
Es ist eine neue Welt , in der structs null sein kann und Referenzen können nicht null, switch - Anweisungen umgekehrt und vielfältig sein !, !!, ?und ??vor und nach Eigenschaften bedeuten , verschiedene Dinge. Wann wird der syntaktische Zucker High-End?
Ja72

3
Ist es das gleiche wie value != null?
ca9163d9

7

Obwohl Daniels Antwort richtig ist, denke ich, dass es nützlich sein könnte, einen Kontext darüber hinzuzufügen, warum das leere Eigenschaftsmuster möglicherweise verwendet wird. Betrachten Sie diese Beispiel-Controller-Methode, für die eine Validierung erforderlich ist:

public async Task<IActionResult> Update(string id, ...) 
{
    if (ValidateId(id) is { } invalid)
        return invalid;
    ...
}

In obigem, ValidateId() null oder eine Instanz von zurückgeben BadObjectRequestResult. Wenn der erstere zurückgegeben wird, ist die Validierung erfolgreich und geht zum Rest des Körpers von über Update. Wenn letzteres zurückgegeben wird, is {}ist wahr (dh natürlich ist eine Instanz von BadObjectRequestResulteine object), und die Validierung schlägt fehl.

Aus diesem Grund haben wir auch einen Variablennamen angegeben invalid, den wir sofort zurückgeben können. Ohne das würden wir etwas ausführlicheren Code brauchen.

public async Task<IActionResult> Update(string id, ...) 
{
    var invalid = ValidateId(id);
    if (invalid != null)
        return invalid;
    ...
}

Ob das eine besser lesbar ist oder das andere dem Leser überlassen bleibt, ich habe nur eine Möglichkeit vorgestellt, wie das leere Eigenschaftsmuster verwendet werden kann.


In diesem Fall sollte man is object invalidnicht verwendenis {} invalid
Panagiotis Kanavos

1
@PanagiotisKanavos, die in diesem Fall nicht funktionieren würden, da eine Rückgabe von IActionResulterforderlich ist (auch technisch Task<IActionResult>). Wenn wir mit Ihrem Stil gehen, ifhat das das gleiche Ergebnis, invalidwird aber ein sein, objectso dass dies nicht kompiliert wird.
Kit

0

Ich denke, es ist zu überprüfen, ob der Wert ein leeres Objekt ist

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.