Je vois parfois le code suivant et je n'ai aucune idée de ce que l'expression teste réellement.
public static void Something(string[] value)
{
if (value is { })
{
DoSomethingElse();
}
}
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 pouris 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:
Dans ce qui précède,
ValidateId()
pourrait retourner null ou une instance deBadObjectRequestResult
. Si le premier est retourné, la validation est réussie et passe au reste du corps deUpdate
. Si ce dernier est retourné,is {}
est vrai (c'est-à-dire bien sûr qu'une instance deBadObjectRequestResult
est unobject
), 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é.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.
la source
is object invalid
, pasis {} invalid
IActionResult
est requis (enfin techniquementTask<IActionResult>
). Si nous allons avec votre style, leif
a le même résultat maisinvalid
sera unobject
donc ce ne sera pas compilé.Je pense que c'est pour vérifier si la valeur est un objet vide
la source