web-dev-qa-db-fra.com

?: ?? Opérateurs au lieu de IF | ELSE

public string Source
{
    get
    {
        /*
        if ( Source == null ){
            return string . Empty;
        } else {
            return Source;
        }
        */
        return Source ?? string.Empty;
    }
    set
    {
        /*
        if ( Source == null ) {
            Source = string . Empty;
        } else {
            if ( Source == value ) {
                Source = Source;
            } else {
                Source = value;
            }
        }
        */
        Source == value ? Source : value ?? string.Empty;
        RaisePropertyChanged ( "Source" );
    }
}

Puis-je utiliser ?:?? opérateurs EXACTEMENT comme Si/Sinon?


Ma question:
Comment écrire ce qui suit avec?: ?? les opérateurs

[1]

if ( Source == null ){
    // Return Nothing
} else {
    return Source;
}

[2]

if ( Source == value ){
    // Do Nothing
} else {
    Source = value;
    RaisePropertyChanged ( "Source" );
} 

brièvement: Comment ne rien faire, ne rien retourner et faire plusieurs instructions avec l'opérateur ?:???

82
Ahmed Ghoneim

Pour [1], vous ne pouvez pas: ces opérateurs sont amenés à renvoyer une valeur et non à effectuer des opérations.

L'expression

a ? b : c

évalue b si a est vrai et évalue à c si a est faux.

L'expression

b ?? c

évalue b si b n'est pas nul et évalue à c si b est nul.

Si vous écrivez

return a ? b : c;

ou

return b ?? c;

ils vont toujours retourner quelque chose.

Pour [2], vous pouvez écrire une fonction qui retourne la bonne valeur pour effectuer vos "opérations multiples", mais c'est probablement pire que de simplement utiliser if/else.

189
trutheality

L'opérateur ternaire (?:) n'est pas conçu pour flux de contrôle, il est uniquement conçu pour affectation conditionnelle. Si vous devez contrôler le flux de votre programme, utilisez une structure de contrôle, telle que if/else.

41

En faisant référence à ?: Opérateur (référence C #)

L'opérateur conditionnel (? :) renvoie l'une des deux valeurs en fonction de la valeur d'une expression booléenne. Voici la syntaxe de l'opérateur conditionnel.

En se référant à ?? opérateur (référence C #)

Le ?? L'opérateur est appelé opérateur de coalescence nulle. Il est utilisé pour définir une valeur par défaut pour les types de valeur nullable ainsi que pour les types de référence. Il retourne l'opérande de gauche s'il n'est pas nul; sinon, il retourne l'opérande correct.

Cela signifie:

[Partie 1]

return source ?? String.Empty;

[Partie 2] n'est pas applicable ...

11
Akram Shahda

Le "ne rien faire" ne fonctionne pas vraiment?

si par // retourne rien que tu veux dire réellement retourne null alors écris

return Source;

si vous voulez dire, ignorez le chemin de code puis écrivez

 if ( Source != null )
            {
                return Source;
            }
// source is null so continue on.

Et pour le dernier

 if ( Source != value )
            { Source = value;
                RaisePropertyChanged ( "Source" );
            }

// nothing done.
3
Vinnyq12

L'opérateur ternaire RETOURNE l'une des deux valeurs. Ou bien, il peut exécuter l'une des deux instructions en fonction de sa condition, mais ce n'est généralement pas une bonne idée, car cela peut entraîner des effets secondaires non souhaités.

bar ? () : baz();

Dans ce cas, le () ne fait rien, alors que baz fait quelque chose. Mais vous avez seulement rendu le code moins clair. Je préférerais un code plus verbeux, plus clair et plus facile à gérer.

De plus, cela n’a aucun sens:

var foo = bar ? () : baz();

puisque () n'a pas de type de retour (c'est vide) et baz a un type de retour inconnu au moment de l'appel dans cet exemple. S'ils ne sont pas d'accord, le compilateur va se plaindre et fort.

3
Mike Hofer

Si vous êtes préoccupé par la verbosité de votre code, j'écrirais ceci plutôt que d'essayer d'abuser des expressions.

if (Source == value) return;
Source = value;
RaisePropertyChanged("Source");
2
ChaosPandion

the?: est l'opérateur de l'itinéraire. (crois que j’ai bien épelé cela) et qu’il est simple à utiliser. comme dans un prédicat booléen? si vrai: sialse; Mais vous devez avoir une valeur rvalue/lvalue comme dans le prédicat rvalue =? si c'est vrai: iffalse;

ex int i = x < 7 ? x : 7;

si x était inférieur à 7, je serais assigné x, sinon je serais 7.

vous pouvez également l'utiliser dans une déclaration, comme dans return x < 7 ? x : 7;

encore une fois, comme ci-dessus, cela aurait le même effet.

donc, Source = Source == value ? Source : string.Empty; je crois que c’est ce que vous essayez d’atteindre.

1
johnathan

L'opérateur ?: renvoie l'une des deux valeurs en fonction de la valeur d'une expression booléenne.

Condition-Expression ? Expression1 : Expression2

Vous trouverez plus d'informations ici sur l'opérateur ?:, également appelé opérateur ternaire:

1
rudenaggar

Je ne pense pas que vous puissiez le faire en tant qu’opérateur et qu’il est supposé renvoyer l’un ou l’autre. Ce n'est pas le cas si le remplacement d'une instruction est différent, bien qu'il puisse être utilisé pour cela dans certains cas.

0
atbebtg