Qu'est ce que ca veut dire?

36

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();
   }
}
evan
la source

Réponses:

28

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 objectchè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 switchexpressions.

Daniel A. White
la source
1
que signifie objet vide dans ce cas? chaîne vide, espace blanc?
OlegI
3
@OlegI non ce n'est pas. sn'est définitivement pas nul. is {}est un raccourci pour is objectet les chaînes peuvent être converties en objet.
Panagiotis Kanavos
6
@OlegI comment ça? c'est une référence valide pour qu'elle corresponde.
Daniel A. White
3
Son un nouveau monde où struct peuvent être nuls et les références ne peuvent pas être nuls, les états de commutation sont inversés et divers !, !!, ?et ??avant et après les propriétés signifie des choses différentes. Quand sera le sucre syntaxique haut de gamme?
ja72
3
Est-ce la même chose que value != null?
ca9163d9
7

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 BadObjectRequestResultest 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.

Trousse
la source
Dans ce cas, il faut utiliser is object invalid, pasis {} invalid
Panagiotis Kanavos
1
@PanagiotisKanavos qui ne fonctionnerait pas dans ce cas car un retour de IActionResultest requis (enfin techniquement Task<IActionResult>). Si nous allons avec votre style, le ifa le même résultat mais invalidsera un objectdonc ce ne sera pas compilé.
Kit
0

Je pense que c'est pour vérifier si la valeur est un objet vide

Néhémie
la source