48 votes

Dois-je utiliser `!IsGood` ou `IsGood == false` ?

Je continue à voir du code qui fait des vérifications comme ceci

if (IsGood == false)
{
   DoSomething();
}

ou ceci

if (IsGood == true)
{
   DoSomething();
}

Je déteste cette syntaxe, et utilise toujours la syntaxe suivante.

if (IsGood)
{
   DoSomething();
}

o

if (!IsGood)
{
   DoSomething();
}

Y a-t-il une raison d'utiliser ' == true ou == false ' ?

Est-ce un problème de lisibilité ? Les gens ne comprennent-ils pas les variables booléennes ?

Par ailleurs, y a-t-il une différence de performance entre les deux ?

14 votes

Si cela vous dérange à ce point, votre vie sera longue et difficile.

4 votes

C'est une question juste pour laquelle le PO ne semble pas trop agacé.

0 votes

Oui, c'est valable. Je doute de moi-même avec des choses simples de temps en temps et je trouve occasionnellement une bonne raison de changer mes habitudes...

104voto

Patrick Desjardins Points 51478

Je suis la même syntaxe que vous, c'est moins verbeux.

Les personnes (plus débutantes) préfèrent utiliser == true juste pour être sûr que c'est ce qu'ils veulent. Ils ont l'habitude d'utiliser l'opérateur dans leur conditionnel... ils le trouvent plus lisible. Mais une fois que vous êtes plus avancé, vous avez trouvé cela irritant parce que c'est trop verbeux.

0 votes

Les débutants ne sont pas les seuls à le préférer ; toute personne désireuse de maximiser la lisibilité du code le préfère. Quel est le coût ?

0 votes

Je l'ai trouvé plus lisible de la manière la plus courte... quel est le but de droite ==vrai quand le côté gauche est déjà vrai/faux... Ne pas dire "n'importe qui"... Je suis d'accord avec Daok, j'ai fait cela il y a quelques mois avant de réaliser mon erreur.

0 votes

@litb : Je sais que c'est la première fois que je vois les votes monter aussi vite :P dans les 20 dernières minutes, il a obtenu environ 15 votes. Incroyable

40voto

Rob Gilliam Points 540

Je glousse toujours (ou je jette quelque chose sur quelqu'un, selon mon humeur) quand je tombe sur

if (someBoolean == true) { /* ... */ }

parce que si vous ne pouvez pas compter sur le fait que votre comparaison renvoie un booléen, vous ne pouvez pas non plus compter sur le fait de comparer le résultat à true, donc le code devrait devenir

if ((someBoolean == true) == true) { /* ... */ }

mais, bien sûr, cela devrait être

if (((someBoolean == true) == true) == true) { /* ... */ }

mais, bien sûr...

(ah, la compilation a échoué. Retour au travail.)

3 votes

Un peu comme Monty Python et le sketch du spam... Je veux un test If avec Spam, Spam, Spam, true, et Spam......

32voto

IgorK Points 547

Je préférerais plus court variante. Mais parfois == false permet de rendre votre code encore plus court :

Pour les scénarios de la vie réelle dans les projets utilisant C# 2.0, je ne vois qu'une seule bonne raison de procéder ainsi : bool? type. Trois états bool? est utile et il est facile de vérifier une de ses valeurs possibles de cette manière.

En fait, vous ne pouvez pas utiliser (!IsGood) si IsGood es bool? . Mais l'écriture (IsGood.HasValue && IsGood.Value) est pire que (IsGood == true) .

Jouez avec cet échantillon pour vous faire une idée :

bool? value = true; // try false and null too

if (value == true)
{
    Console.WriteLine("value is true");
}
else if (value == false)
{
    Console.WriteLine("value is false");
}
else
{
    Console.WriteLine("value is null");
}

Il y a un autre cas que je viens de découvrir où if (!IsGood) { ... } n'est pas la même chose que if (IsGood == false) { ... } . Mais celui-ci n'est pas réaliste ;) La surcharge d'opérateurs peut aider ici :) (et l'opérateur true/false qui AFAIK est déconseillé en C# 2.0 parce que son but est de fournir un comportement similaire à celui des bool?s pour les types définis par l'utilisateur et maintenant vous pouvez l'obtenir avec les types standards !)

using System;

namespace BoolHack
{
    class Program
    {
        public struct CrazyBool
        {
            private readonly bool value;

            public CrazyBool(bool value)
            {
                this.value = value;
            }

            // Just to make nice init possible ;)
            public static implicit operator CrazyBool(bool value)
            {
                return new CrazyBool(value);
            }

            public static bool operator==(CrazyBool crazyBool, bool value)
            {
                return crazyBool.value == value;
            }

            public static bool operator!=(CrazyBool crazyBool, bool value)
            {
                return crazyBool.value != value;
            }

            #region Twisted logic!

            public static bool operator true(CrazyBool crazyBool)
            {
                return !crazyBool.value;
            }

            public static bool operator false(CrazyBool crazyBool)
            {
                return crazyBool.value;
            }

            #endregion Twisted logic!
        }

        static void Main()
        {
            CrazyBool IsGood = false;

            if (IsGood)
            {
                if (IsGood == false)
                {
                    Console.WriteLine("Now you should understand why those type is called CrazyBool!");
                }
            }
        }
    }
}

Alors... s'il vous plaît, utilisez la surcharge des opérateurs avec prudence :(

0 votes

(IsGood == true) ne fonctionnera pas non plus, si IsGood est un bool nullable. Vous devrez écrire (IsGood.HasValue && IsGood.Value == true), ce qui est encore plus verbeux et sans doute moins clair que (IsGood.HasValue && IsGood.Value).

0 votes

Charles, je pense que tu as tort. Pour Nullable<T> vous obtiendrez T comme type de la propriété Value (bool dans notre cas, donc (... && IsGood.Value) devrait fonctionner). Vous pouvez également utiliser la forme la plus courte. Essayez de jouer avec l'exemple que je viens d'ajouter à la réponse.

0 votes

IgorK, je suis d'accord, [IsGood.Value] fonctionnerait, (si IsGood a une valeur...) Je disais que le fait d'écrire IsGood == true ne fonctionnera pas si IsGood est Nullable<bool> Dans ce cas, IsGood n'est PAS un bool, c'est Nullable<bool> donc vous ne pouvez pas le comparer avec "true", cela créerait une incompatibilité de type.

18voto

Nick Berardi Points 31361

Selon Code complet un livre Jeff tient son nom de et tient en haute estime ce qui suit est la façon dont vous devriez traiter les booléens.

if (IsGood)
if (!IsGood)

J'avais l'habitude de comparer les booléens, mais je me suis dit pourquoi ajouter une étape supplémentaire au processus et traiter les booléens comme des types de second ordre. A mon avis, une comparaison renvoie un booléen et un type booléen est déjà un booléen, alors pourquoi ne pas simplement utiliser le booléen.

En réalité, le débat se résume à l'utilisation de bons noms pour vos booléens. Comme vous l'avez fait ci-dessus, je formule toujours mes objets booléens à la manière d'une question. Par exemple

  • IsGood
  • HasValue
  • etc.

15voto

Michael Burr Points 181287

La technique consistant à tester spécifiquement contre true ou false est définitivement une mauvaise pratique si la variable en question est réellement censée être utilisée comme une valeur booléenne (même si son type n'est pas booléen) - surtout en C/C++. Tester contre true peut (et va probablement) conduire à des bugs subtils :

Ces tests apparemment similaires donnent des résultats opposés :

// needs C++ to get true/false keywords
// or needs macros (or something) defining true/false appropriately
int main( int argc, char* argv[])
{
    int isGood = -1;

    if (isGood == true) {
        printf( "isGood == true\n");
    }
    else {
        printf( "isGood != true\n");
    }

    if (isGood) {
        printf( "isGood is true\n");
    }
    else {
        printf( "isGood is not true\n");
    }

    return 0;
}

Cela affiche le résultat suivant :

isGood != true
isGood is true

Si vous ressentez le besoin de tester une variable qui est utilisée comme un indicateur booléen contre vrai/faux (ce qui ne devrait pas être fait à mon avis), vous devriez utiliser l'idiome de toujours tester contre faux parce que faux ne peut avoir qu'une seule valeur ( 0 ) alors qu'un vrai peut avoir plusieurs valeurs possibles (tout ce qui est autre que 0 ):

if (isGood != false) ...  // instead of using if (isGood == true)

Certaines personnes penseront qu'il s'agit d'un défaut du C/C++, et c'est peut-être vrai. Mais c'est une réalité dans ces langages (et probablement dans beaucoup d'autres). Je m'en tiendrais donc à l'idiome court, même dans des langages comme C# qui ne permettent pas d'utiliser une valeur entière comme un booléen.

Voir cette question SO pour un exemple de cas où ce problème a réellement touché quelqu'un...

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