Respostas:
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.
sdefinitivamente não é nulo. is {}é uma abreviação para is objecte 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:
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.
is object invalid, nãois {} invalid
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.