我应该使用`!IsGood`还是`IsGood == false`?

我不断看到这样的检查代码

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

或这个

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

我讨厌这个语法,总是使用下面的语法。

 if (IsGood) { DoSomething(); } 

要么

 if (!IsGood) { DoSomething(); } 

有没有什么理由使用' == true '或' == false '?

这是一个可读性的东西? 人们不理解布尔variables吗?

另外,两者之间有什么performance差异?

我遵循与你一样的语法,它不那么冗长。

人们(更多的初学者)更喜欢使用==真正只是为了确保它是他们想要的。 他们习惯于在条件中使用操作符……他们发现它更具可读性。 但是一旦你变得更高级了,你会发现它太刺激了,因为它太冗长了。

当我遇到我时,我总是轻笑(或根据我的心情向某人扔东西)

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

因为当然,如果你不能依靠你的比较返回一个布尔值的事实,那么你不能依靠比较结果为真,所以代码应该成为

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

但是,当然,这应该是真的

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

但是当然 …

(啊,汇编失败,回去工作。)

我宁愿更短的变体。 但是有时== false有助于使代码更短:

对于使用C#2.0的项目中的实际场景,我只看到一个很好的理由: bool? types。 三态bool? 是有用的,很容易以这种方式检查其可能的值之一。

其实你不能用(!IsGood)如果IsGoodbool? 。 但是写(IsGood.HasValue && IsGood.Value)(IsGood == true)

玩这个例子来得到想法:

  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"); } 

还有一个例子,我发现if (!IsGood) { ... }if (IsGood == false) { ... } 。 但这是不现实的;)运算符重载在这里可能有所帮助:)(和操作符真/假,AFAIK在C#2.0中是不鼓励的,因为它的目的是为用户定义的types提供布尔类似的行为,现在你可以用标准的types来获得它!)

 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!"); } } } } } 

所以…请谨慎使用运算符重载:(

根据代码完成一本书杰夫得到他的名字,并高度重视以下是你应该对待布尔人的方式。

 if (IsGood) if (!IsGood) 

我用实际比较布尔值,但我想明白为什么要在这个过程中增加一个额外的步骤,并将布尔值作为二元types。 在我看来,比较返回一个布尔值,布尔types已经是一个布尔值,所以为什么不使用布尔值。

真正的争论是什么,为你的布尔人使用好名字。 就像你在上面所做的那样,我总是在一个问题中使用我的布尔对象。 如

  • 很好
  • 的HasValue
  • 等等

如果所讨论的variables实际上被认为是一个布尔值(即使它的types不是布尔值) – 特别是在C / C ++中,那么专门针对真或假testing的技术绝对是不好的做法。 testingtrue可以(也可能会)导致微妙的错误:

这些显然相似的testing给出了相反的结果:

 // 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; } 

这显示以下结果:

 isGood != true isGood is true 

如果您觉得需要testing用作布尔标志的真/假的variables(我认为这不应该这样做),您应该使用总是testing的习惯用法,因为false只能有一个值( 0 ),而一个true可以有多个可能的值( 0以外的任何值):

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

有人会认为这是C / C ++的一个缺陷,这可能是事实。 但是这是这些语言(也可能是许多其他语言)中的生活事实,所以我会坚持使用简短的习惯用法,即使在像C#这样的语言中,也不允许使用整数值作为布尔值。

看到这个问题的例子,这个问题实际上是一个人在哪里…

  • isalpha()== true计算结果为false?

我同意你的看法(也为此感到恼火)。 我觉得IsGood == true评估只是一个小小的误解,IsGood就是这样开始的。

我经常看到这些SomeStringObject.ToString()近实例。

这就是说,在types松散的语言中,这可能是合理的。 但不是在C#中。

有些人发现显式检查与已知值相比更具可读性,因为您可以通过阅读来推断variablestypes。 我不知道另一个人是否更好。 他们都工作。 我发现,如果这个variables本质上持有一个“逆”,那么我似乎倾向于检查一个值:

 if(IsGood) DoSomething(); 

要么

 if(IsBad == false) DoSomething(); 

代替

 if(!IsBad) DoSomething(); 

但是,这对我来说并不重要,我相信它最终会成为同样的IL。

仅可读性

如果编译到机器代码中,您select的方式更有效。 不过,我期望他们产生完全相同的机器码。

从迄今为止的答案来看,这似乎是共识:

  1. 简式在大多数情况下是最好的。 (IsGood和!IsGood)
  2. 布尔variables应写为正数。 (IsGood而不是IsBad)
  3. 由于大多数编译器会以任何方式输出相同的代码,除了解释型语言外,没有性能差异。
  4. 这个问题没有明确的获胜者可能被视为编码风格的宗教战争中的一场战斗。

我更喜欢使用:

 if (IsGood) { DoSomething(); } 

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

因为我发现这更可读 – ! 太容易错过(在阅读和打字时); 如果不是IsGood,那么……当我听到时,听起来并不正确,而不是“如果IsGood是假的,那么…”,这听起来更好。

这是可能的(尽pipe不太可能,至less我希望)在C代码中,TRUE和FALSE被定义为除了1和0以外的东西。例如,程序员可能已经决定使用0作为“真”,-1作为“假“在一个特定的API。 传统C ++代码也是如此,因为“真”和“假”并不总是C ++关键字,特别是在ANSI标准出现之前。

另外值得指出的是,某些语言,特别是像Perl,JavaScript和PHP这样的脚本语言,可以有趣地解释什么样的值是真实的,哪些值是错误的。 这是可能的(尽pipe希望不大),“foo == false”意味着与“!foo”略有不同。 这个问题被标记为“语言不可知”,一种语言可以定义==操作符不能以与! 运营商。

我已经看到以下作为C / C ++风格的要求。

 if ( true == FunctionCall()) { // stuff } 

原因是如果你不小心把“=”而不是“==”,编译器将保留给一个常量赋值。 与此同时,它伤害了每一个单一的陈述的可读性。

偶尔它在可读性方面也有用处。 有时候,一个命名的variables或函数调用最终会成为一个双重否定的东西,这会让人感到困惑,并且像这样明确地进行testing可以提高可读性。

一个很好的例子可能是strcmp()C / C ++,如果string相等则返回0,否则返回0或0,这取决于差异在哪里。 所以你会经常看到:

 if(strcmp(string1, string2)==0) { /*do something*/ } 

但是,一般来说,我会同意你的看法

 if(!isCached) { Cache(thing); } 

阅读更清晰。

我更喜欢!是因为对我来说,这是更清楚和更合理的。 检查布尔== true是否是多余的,所以我会避免这一点。 但是从句法上来说,我不认为IsGood == false是否有区别。

我更喜欢IsGood方法,我认为大多数来自c语言背景的人也会更喜欢它。 我只是在这里猜测,但我认为大部分编写IsGood == False的人都来自像Visual Basic这样更冗长的语言背景。

为了便于阅读,您可能会考虑依赖其他属性的属性:

 public bool IsBad get { { return !IsGood; } } 

那么,你真的可以穿越意义:

 if(IsBad) { ... } 

!IsGood模式是当eaiser发现比IsGood == false时减less到正则expression式。

 /\b!IsGood\b/ 

VS

 /\bIsGood\s*==\s*false\b/ /\bIsGood\s*!=\s*true\b/ /\bIsGood\s*(?:==\s*false|!=\s*true)\b/ 

就我个人而言,我更喜欢Bob叔叔在Clean Code中提到的forms:

 (...) if (ShoouldDoSomething()) { DoSomething(); } (...) bool ShouldDoSomething() { return IsGood; } 

除了最微不足道的条件外,其他条件都放在谓词函数中。 那么关于布尔expression式的实现是否可读性呢?

在很多语言中,不同之处在于,在一种情况下,编译器/解释器指定true或false的含义,而另一种情况则由代码定义。 C就是一个很好的例子。

 if (something) ... 

在上面的例子中,“something”与编译器的“true”的定义相比较。 通常这意味着“不为零”。

 if (something == true) ... 

在上面的例子中,“东西”与“真”比较。 语言和/或编译器/解释器都可以定义或不定义“真实”(以及可比性)的types和“真”的值。

通常这两个是不一样的。

唯一更糟糕的是

 if (true == IsGood) {.... 

从来没有理解这种方法背后的想法。

你忘了:

如果(IsGood == FileNotFound )

在我看来(虽然我没有证据来支持这一点),以C#/ javatypes语言开始的人更喜欢“if(CheckSomething())”方法,而以其他语言开始的人(C ++:特别是Win32如果CheckSomething返回一个BOOL(而不是一个BOOL),那么if(CheckSomething())将不起作用。 在许多情况下,API函数显式地返回一个0/1 int / INT而不是真/假值(这是一个BOOL)。

我一直习惯使用更为详细的方法。 它们在语法上是一样的; 我不买“冗长刺激我”的废话,因为程序员不是那个需要留下印象的代码(电脑呢)。 而且,在现实世界中,任何看到我所写的代码的人的技能水平都会有所不同,我也没有时间或倾向于向那些不了解很不重要的人解释陈述评价的特性这样的位。

啊,我有一些合作,赞成更长的forms,认为它比微小更可读!

我开始“修正”,因为布尔人是自给自足的,于是我放弃了十字军东征… ^ _ ^他们不喜欢在这里清理代码,无论如何,它认为它使分支之间的整合困难(这是真的,但那么你永远生活在不好看的代码…)。

如果你写的是正确的布尔variables名称,它应该自然地阅读:
if (isSuccessful)if (returnCode)

在某些情况下,我可能会沉迷于布尔比较,如:
if (PropertyProvider.getBooleanProperty(SOME_SETTING, true) == true)因为它读取较less的“自然”。

出于某种原因,我一直很喜欢

 if (IsGood) 

更多

 if (!IsBad) 

这就是为什么我有点像Ruby的除非(但它有点太容易滥用):

 unless (IsBad) 

甚至更多,如果这样使用:

 raise InvalidColor unless AllowedColors.include?(color) 

Cybis,用C ++编码时也可以使用not关键字。 这是很久以前的标准的一部分,所以这个代码是完全有效的:

 if (not foo ()) bar (); 

编辑:顺便说一句,我忘了提及标准还定义其他布尔关键字,如 (&&), bitand (&) (||), bitor (|), 异或 (^)…他们被称为运算符同义词。

我不使用==,但是有时我使用!=,因为在我的脑海中它更清楚。 但在我的工作中,我们不使用!=或==。 我们尝试使用hasXYZ()或isABC()来获得一个有意义的名字。

如果你真的认为你需要:

 if (Flag == true) 

那么由于条件expression式本身就是布尔值,所以你可能想把它展开为:

 if ((Flag == true) == true) 

等等。 这棺材需要多less钉子?

如果你碰巧在perl中工作,你可以select

 unless($isGood) 

我们倾向于在这里执行以下操作:

 if(IsGood) 

要么

 if(IsGood == false) 

原因是因为我们已经得到了一些不在这里(在Delphi中)的人编写的遗留代码,如下所示:

 if not IsNotGuam then 

这在过去造成了很大的痛苦,所以决定一直试着去检查一下, 如果这是不可能的,那么比较负面和错误。

我唯一能想到的是,在pre.NET.NET Visual Basic中,vebose的代码更有意义,true和false实际上是整数(true = -1,false = 0),布尔expression式被认为是false,对于任何其他非零值都是如此。 所以,对于旧的VB来说,列出的两个方法实际上并不相同,如果你只想让某些事情成为真,如果它评估为-1,你必须明确地比较“真”。 因此,如果计算为整数(因为它不是零),则计算为“+1”的expression式将为真,但不等于“真”。 我不知道为什么VB是这样devise的,但是我看到很多布尔expression式将旧的VB代码中的variables与true和false进行比较。