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 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 para is 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:
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 if
resultado invalid
será o mesmo, mas será um, object
portanto não será compilado.