À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();
}
}
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 object
cheque 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 switch
expressões.
s
definitivamente não é nulo.is {}
é uma abreviação parais object
e seqüências de caracteres podem ser convertidas em objeto.!
,!!
,?
e??
antes e depois de propriedades significar coisas diferentes. Quando o açúcar sintático chegará ao fim?value != null
?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:
No acima,
ValidateId()
poderia retornar nulo ou uma instância deBadObjectRequestResult
. Se o primeiro for retornado, a validação será bem-sucedida e passará para o resto do corpo deUpdate
. Se o último for retornado,is {}
é verdadeiro (ou seja , é claro que uma instância deBadObjectRequestResult
é umobject
) 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.Se um é mais legível ou o outro depende do leitor, acabamos de apresentar uma maneira de usar o padrão de propriedades vazias.
fonte
is object invalid
, nãois {} invalid
IActionResult
é necessário um retorno de (bem tecnicamenteTask<IActionResult>
). Se seguirmos o seu estilo, oif
resultadoinvalid
será o mesmo, mas será um,object
portanto não será compilado.Eu acho que é para verificar se o valor é um objeto vazio
fonte