Czasami widzę następujący kod i nie mam pojęcia, co wyrażenie faktycznie testuje.
public static void Something(string[] value)
{
if (value is { })
{
DoSomethingElse();
}
}
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:
W powyższym przypadku
ValidateId()
może zwrócić wartość null lub wystąpienieBadObjectRequestResult
. Jeśli to pierwsze zostanie zwrócone, sprawdzanie poprawności zakończy się powodzeniem i przejdzie do pozostałej części ciałaUpdate
. Jeśli to drugie zostanie zwrócone,is {}
jest prawdziwe (tzn. Oczywiście instancjaBadObjectRequestResult
to anobject
), 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.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.
źródło
is object invalid
, a nieis {} invalid
IActionResult
wymagany jest zwrot (dobrze technicznieTask<IActionResult>
). Jeśli pójdziemy z twoim stylem, będzie toif
miało ten sam wynik, aleinvalid
będzie,object
więc nie będzie się kompilować.Myślę, że należy sprawdzić, czy wartość jest pustym obiektem
źródło