85 votes

?: ?? Opérateurs au Lieu De if|ELSE

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

Puis-je utiliser ?: ?? les opérateurs EXACTEMENT comme Si/d'Autre ?


Ma Question :
Comment écrire le suivant ?: ?? 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 faire pour Ne Rien faire , ne Retournent Rien Faire de Multiples Instructions avec ?: ?? Les opérateurs ?

204voto

trutheality Points 13261

Pour [1], vous ne pouvez pas: ces opérateurs sont à retourner une valeur, ne pas effectuer des opérations.

L'expression

a ? b : c

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

L'expression

b ?? c

évalue b si b n'est pas null et évalue c si b a la valeur null.

Si vous écrivez

return a ? b : c;

ou

return b ?? c;

ils vont toujours revenir à quelque chose.

Pour [2], vous pouvez écrire une fonction qui retourne la valeur de droite qui réalise vos "plusieurs opérations", mais c'est probablement pire qu'à l'aide de if/else.

42voto

Oli Charlesworth Points 148744

L'opérateur ternaire (?:) n'est pas conçu pour le contrôle de flux, c'est uniquement conçu pour la cession conditionnelle. Si vous avez besoin de contrôler le flux de votre programme, utilisez une structure de contrôle, telles que l' if/else.

11voto

Akram Shahda Points 9902

Se référant à ?: Opérateur (Référence C#)

L'opérateur conditionnel (?:) retourne l'une des deux valeurs en fonction de la la valeur d'une expression Booléenne. La syntaxe est la suivante pour l' opérateur conditionnel.

Se référant à l' ?? Opérateur (Référence C#)

L' ?? l'opérateur est appelé le null-coalescence de l'opérateur et est utilisé pour définir une valeur par défaut pour un nullable types de valeur ainsi que les types de référence. Elle renvoie l' de gauche opérande si elle n'est pas nulle; sinon, elle retourne la droite l'opérande.

Cela signifie que:

[Partie 1]

return source ?? String.Empty;

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

3voto

Mike Hofer Points 6559

L'opérateur ternaire RETOURNE l'une des deux valeurs. Ou, il peut exécuter l'un des deux états en fonction de son état, mais ce n'est généralement pas une bonne idée, car il peut conduire à des effets secondaires indésirables.

bar ? () : baz();

Dans ce cas, les () ne fait rien, tandis que baz fait quelque chose. Mais vous avez seulement fait le code de moins en moins claires. J'irais pour plus de commentaires de code plus claire et plus facile à maintenir.

De plus, cela n'a guère de sens:

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

depuis le () n'a pas de type de retour (c'est nul) et baz a un type de retour qui est inconnu au moment de l'appel dans le présent échantillon. Si ils ne sont pas d'accord, le compilateur va se plaindre, et d'une voix forte.

3voto

Vinnyq12 Points 746

"Ne rien faire" ne fonctionne pas vraiment pour ?

si par // Retourne Rien ne vous fait dire de retourner la valeur null alors écrire

return Source;

si vous voulez dire, ignorer le codepath puis écrire

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

Et pour la dernière

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

// nothing done.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X