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();
}
}
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 object
Scheck, 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 switch
Ausdrücken verglichen werden .
s
ist definitiv nicht null.is {}
ist eine Abkürzung füris object
und Zeichenfolgen können in Objekte umgewandelt werden.!
,!!
,?
und??
vor und nach Eigenschaften bedeuten , verschiedene Dinge. Wann wird der syntaktische Zucker High-End?value != null
?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:
In obigem,
ValidateId()
null oder eine Instanz von zurückgebenBadObjectRequestResult
. Wenn der erstere zurückgegeben wird, ist die Validierung erfolgreich und geht zum Rest des Körpers von überUpdate
. Wenn letzteres zurückgegeben wird,is {}
ist wahr (dh natürlich ist eine Instanz vonBadObjectRequestResult
eineobject
), 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.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.
quelle
is object invalid
nicht verwendenis {} invalid
IActionResult
erforderlich ist (auch technischTask<IActionResult>
). Wenn wir mit Ihrem Stil gehen,if
hat das das gleiche Ergebnis,invalid
wird aber ein sein,object
so dass dies nicht kompiliert wird.Ich denke, es ist zu überprüfen, ob der Wert ein leeres Objekt ist
quelle