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 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ür is 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:
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 BadObjectRequestResult
eine 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 invalid
nicht verwendenis {} invalid
IActionResult
erforderlich ist (auch technisch Task<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.