Odpowiedzi:
To tylko pusty wzorzec właściwości w C # 8, co oznacza, że wartość nie null. Pasuje do dowolnego typu wartości lub typu odniesienia. Jak zauważa Panagiotis Kanavos w komentarzach, jest to odpowiednik starej dobrej value is objectkontroli, która była w C # od dłuższego czasu.
Ogólnie, jeśli miałbyś określić właściwość, to by pasowała, czy nie. Ten ezoteryczny przykład pokazuje, że:
if (value is { Length: 2 })
{
// matches any object that isn't `null` and has a property set to a length of 2
}
Wzorce właściwości działają najlepiej i są najbardziej wyraźne w porównaniu z innymi wzorami w przypadkach takich jak switchwyrażenia.
sma zdecydowanie inną wartość niż null. is {}jest skrótem, is objecta ciągi mogą być rzutowane na obiekt.
!, !!, ?a ??przed i po Właściwości oznaczać różne rzeczy. Kiedy wysokiej klasy cukier syntaktyczny?
value != null?
Chociaż odpowiedź Daniela jest słuszna, myślę, że przydatne może być dodanie kontekstu, dlaczego możesz zobaczyć używany wzór pustej właściwości. Rozważ tę przykładową metodę kontrolera, która wymaga pewnej weryfikacji:
public async Task<IActionResult> Update(string id, ...)
{
if (ValidateId(id) is { } invalid)
return invalid;
...
}
W powyższym przypadku ValidateId()może zwrócić wartość null lub wystąpienie BadObjectRequestResult. Jeśli to pierwsze zostanie zwrócone, sprawdzanie poprawności zakończy się powodzeniem i przejdzie do pozostałej części ciała Update. Jeśli to drugie zostanie zwrócone, is {}jest prawdziwe (tzn. Oczywiście instancja BadObjectRequestResultto an object), a sprawdzanie poprawności kończy się niepowodzeniem.
Cóż, dodaliśmy do tego nazwę zmiennej invalid, którą możemy natychmiast zwrócić. Bez tego potrzebowalibyśmy nieco więcej pełnego kodu.
public async Task<IActionResult> Update(string id, ...)
{
var invalid = ValidateId(id);
if (invalid != null)
return invalid;
...
}
Niezależnie od tego, czy jeden jest bardziej czytelny, czy drugi zależy od czytelnika, właśnie przedstawiłem jeden ze sposobów wykorzystania wzorca pustej właściwości.
is object invalid, a nieis {} invalid
IActionResultwymagany jest zwrot (dobrze technicznie Task<IActionResult>). Jeśli pójdziemy z twoim stylem, będzie to ifmiało ten sam wynik, ale invalidbędzie, objectwięc nie będzie się kompilować.