O que faz é significativo?

36

Às vezes, vejo o código a seguir e não faço ideia do que a expressão está realmente testando.

public static void Something(string[] value)
{
   if (value is { })
   {
      DoSomethingElse();
   }
}
evan
fonte

Respostas:

28

Esse é apenas o padrão de propriedade vazia no C # 8, significando que o valor não null. Corresponde a qualquer tipo de valor ou tipo de referência. Como Panagiotis Kanavos observa nos comentários, isso é equivalente ao bom e velho value is objectcheque que está em C # há muito tempo.

Geralmente, se você especificar uma propriedade, ela corresponderá ou não. Este exemplo esotérico ilustra que:

if (value is { Length: 2 })
{
   // matches any object that isn't `null` and has a property set to a length of 2
}

Os padrões de propriedade funcionam melhor e são mais claros quando comparados com outros padrões em casos como switchexpressões.

Daniel A. White
fonte
11
o que significa objeto vazio neste caso? corda vazia, espaço em branco?
OlegI 26/02
3
@ OlegI não, não é. sdefinitivamente não é nulo. is {}é uma abreviação para is objecte seqüências de caracteres podem ser convertidas em objeto.
Panagiotis Kanavos
6
@OlegI como assim? é uma referência válida para que corresponda.
Daniel A. White
3
É um novo mundo onde estruturas pode ser nulo e referências não pode ser nulo, declarações switch são invertidos e vários !, !!, ?e ??antes e depois de propriedades significar coisas diferentes. Quando o açúcar sintático chegará ao fim?
ja72 26/02
3
É o mesmo que value != null?
ca9163d9 27/02
7

Embora a resposta de Daniel esteja certa, acho que pode ser útil adicionar algum contexto sobre por que você pode ver o padrão de propriedade vazio em uso. Considere este método de controlador de exemplo que precisa de validação:

public async Task<IActionResult> Update(string id, ...) 
{
    if (ValidateId(id) is { } invalid)
        return invalid;
    ...
}

No acima, ValidateId()poderia retornar nulo ou uma instância de BadObjectRequestResult. Se o primeiro for retornado, a validação será bem-sucedida e passará para o resto do corpo de Update. Se o último for retornado, is {}é verdadeiro (ou seja , é claro que uma instância de BadObjectRequestResulté um object) e a validação falha.

Muito bem, também fornecemos um nome de variável invalid, que podemos retornar imediatamente. Sem isso, precisaríamos de um código um pouco mais detalhado.

public async Task<IActionResult> Update(string id, ...) 
{
    var invalid = ValidateId(id);
    if (invalid != null)
        return invalid;
    ...
}

Se um é mais legível ou o outro depende do leitor, acabamos de apresentar uma maneira de usar o padrão de propriedades vazias.

Kit
fonte
Nesse caso, deve-se usar is object invalid, nãois {} invalid
Panagiotis Kanavos
11
@ PanagiotisKanavos que não funcionaria neste caso porque IActionResulté necessário um retorno de (bem tecnicamente Task<IActionResult>). Se seguirmos o seu estilo, o ifresultado invalidserá o mesmo, mas será um, objectportanto não será compilado.
Kit
0

Eu acho que é para verificar se o valor é um objeto vazio

Nehemie
fonte