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 :(
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...
0 votes
Étant donné que la même question s'applique au moins en c/c++/Java, voulez-vous la rendre agnostique au niveau du langage ?
0 votes
Cela ne me dérange pas vraiment, c'est juste que je le vois souvent et je me demandais s'il y avait une raison... Cela dit, je préfère certainement l'un à l'autre.
0 votes
Cela s'applique à VB et à ses variantes, à php et à d'autres langages qui ne sont pas typés.
0 votes
Il me semble que la question que vous posez n'est pas vraiment agnostique si l'on suppose que le booléen est un type dans tous les langages.
0 votes
Ma question était à l'origine destinée à être spécifique à C#.
0 votes
Chaque langage qui prend en charge les variables et les branchements aura une structure similaire. Peu importe que le langage soit "typé" ou non.
1 votes
Chris, ce n'est pas une question de structure de ramification. Le C est typé, mais il n'a pas de type booléen. "if(good)" est différent de "if(good == TRUE)". Le premier signifie que bon est non nul. Le second signifie que bon est exactement égal à VRAI, qui est une valeur entière particulière. Voir la réponse de MikeB pour en savoir plus.
5 votes
Le principal problème à mon avis est que cela donne l'impression que le développeur ne comprend pas vraiment les booléens.