Réponses:
C'est juste le modèle de propriété vide en C # 8, ce qui signifie que la valeur n'est pas null
. Il correspond à tout type de valeur ou type de référence. Comme Panagiotis Kanavos le note dans les commentaires, cela équivaut au bon vieux value is object
chèque qui est en C # depuis longtemps.
En général, si vous spécifiez une propriété, elle correspondra ou non. Cet exemple ésotérique illustre que:
if (value is { Length: 2 })
{
// matches any object that isn't `null` and has a property set to a length of 2
}
Les modèles de propriété fonctionnent mieux et sont plus clairs lors de la comparaison avec d'autres modèles dans des cas tels que les switch
expressions.
s
n'est définitivement pas nul. is {}
est un raccourci pour is object
et les chaînes peuvent être converties en objet.
!
, !!
, ?
et ??
avant et après les propriétés signifie des choses différentes. Quand sera le sucre syntaxique haut de gamme?
value != null
?
Bien que la réponse de Daniel soit juste, je pense qu'il pourrait être utile d'ajouter un peu de contexte sur la raison pour laquelle vous pouvez voir le modèle de propriété vide utilisé. Considérez cet exemple de méthode de contrôleur qui nécessite une validation:
public async Task<IActionResult> Update(string id, ...)
{
if (ValidateId(id) is { } invalid)
return invalid;
...
}
Dans ce qui précède, ValidateId()
pourrait retourner null ou une instance de BadObjectRequestResult
. Si le premier est retourné, la validation est réussie et passe au reste du corps de Update
. Si ce dernier est retourné, is {}
est vrai (c'est-à-dire bien sûr qu'une instance de BadObjectRequestResult
est un object
), et la validation échoue.
Eh bien, nous avons également fourni un nom de variable invalid
, que nous pouvons retourner immédiatement. Sans cela, nous aurions besoin d'un code légèrement plus détaillé.
public async Task<IActionResult> Update(string id, ...)
{
var invalid = ValidateId(id);
if (invalid != null)
return invalid;
...
}
Que l'un soit plus lisible ou que l'autre dépend du lecteur, je viens de présenter une façon d'utiliser le modèle de propriété vide.
is object invalid
, pasis {} invalid
IActionResult
est requis (enfin techniquement Task<IActionResult>
). Si nous allons avec votre style, le if
a le même résultat mais invalid
sera un object
donc ce ne sera pas compilé.