Co to znaczy?

36

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();
   }
}
evan
źródło

Odpowiedzi:

28

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.

Daniel A. White
źródło
1
co w tym przypadku oznacza pusty obiekt? pusty ciąg, biała spacja?
OlegI
3
@OlegI nie, to nie jest. sma zdecydowanie inną wartość niż null. is {}jest skrótem, is objecta ciągi mogą być rzutowane na obiekt.
Panagiotis Kanavos
6
@OlegI jak to? jest to prawidłowe odwołanie, więc pasuje.
Daniel A. White
3
Jest to nowy świat, w którym elemencie może być null, a odniesienia nie może być null, oświadczenia przełączników są odwrócone i różne !, !!, ?a ??przed i po Właściwości oznaczać różne rzeczy. Kiedy wysokiej klasy cukier syntaktyczny?
ja72
3
Czy to to samo co value != null?
ca9163d9
7

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.

Zestaw
źródło
W takim przypadku należy użyć is object invalid, a nieis {} invalid
Panagiotis Kanavos
1
@PanagiotisKanavos, które nie działałyby w tym przypadku, ponieważ 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ć.
Zestaw
0

Myślę, że należy sprawdzić, czy wartość jest pustym obiektem

Nehemie
źródło