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 object
kontroli, 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 switch
wyrażenia.
s
ma zdecydowanie inną wartość niż null. is {}
jest skrótem, is object
a 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 BadObjectRequestResult
to 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
IActionResult
wymagany jest zwrot (dobrze technicznie Task<IActionResult>
). Jeśli pójdziemy z twoim stylem, będzie to if
miało ten sam wynik, ale invalid
będzie, object
więc nie będzie się kompilować.