Antworten:
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 .
sist definitiv nicht null. is {}ist eine Abkürzung für is objectund 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:
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.
is object invalidnicht verwendenis {} invalid
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.