Language agnostic 我应该用`!IsGood`或IsGood==false`?

Language agnostic 我应该用`!IsGood`或IsGood==false`?,language-agnostic,boolean,not-operator,Language Agnostic,Boolean,Not Operator,我一直看到这样做检查的代码 if (IsGood == false) { DoSomething(); } 还是这个 if (IsGood == true) { DoSomething(); } 我讨厌这种语法,总是使用下面的语法 if (IsGood) { DoSomething(); } 或 是否有任何理由使用“==true”或“==false” 它是可读性的东西吗?人们只是不理解布尔变量吗 另外,这两者之间有什么性能差异吗?我更喜欢!很好,因为对我来说,它更清晰、更

我一直看到这样做检查的代码

if (IsGood == false)
{
   DoSomething();
}
还是这个

if (IsGood == true)
{
   DoSomething();
}
我讨厌这种语法,总是使用下面的语法

if (IsGood)
{
   DoSomething();
}

是否有任何理由使用“
==true
”或“
==false

它是可读性的东西吗?人们只是不理解布尔变量吗


另外,这两者之间有什么性能差异吗?

我更喜欢
!很好
,因为对我来说,它更清晰、更贴切。不过,检查一个
boolean==true
是否是多余的,所以我会避免这样做。但是,从语法上讲,我认为检查
IsGood==false

没有什么区别。我遵循与您相同的语法,不太冗长

人们(更多的初学者)更喜欢使用
==true
,只是为了确保这是他们想要的。它们用于在条件中使用运算符。。。他们发现它更可读。但是,一旦你进步了,你会发现它很烦人,因为它太冗长了。

我同意你的观点(而且我也很恼火)。我认为这只是一个小小的误解,
IsGood==true
的计算结果是
bool
,这就是
IsGood
的开始

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

这就是说,在使用类型更松散的语言中,这可能是合理的。但不限于C#

可读性


如果您喜欢的方式在编译成机器代码时更有效的话。然而,我希望它们能产生完全相同的机器代码。

有时它在可读性方面也有用处。有时,一个命名变量或函数调用最终可能是一个双重否定的结果,这可能会让人感到困惑,并且像这样使预期的测试显式有助于可读性

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

if(strcmp(string1, string2)==0) { /*do something*/ }
不过总的来说,我同意你的看法

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

阅读起来更清晰。

有些人发现,对已知值的显式检查更具可读性,因为您可以通过阅读推断变量类型。我不知道其中一个是否比另一个好。他们都工作。我发现,如果变量固有地持有一个“逆”,那么我似乎倾向于对照一个值进行检查:

if(IsGood) DoSomething();

而不是

if(!IsBad) DoSomething();

不过,这对我来说也没什么大不了的,而且我确信它最终还是同一个IL。

就我个人而言,我更喜欢Bob叔叔用干净的代码谈论的形式:

(...)
    if (ShouldDoSomething())
    {
        DoSomething();
    }
(...)

bool ShouldDoSomething()
{
    return IsGood;
}

条件句,除了最普通的条件句外,都放在谓词函数中。那么布尔表达式的实现的可读性就不那么重要了。

我更喜欢更短的变体。但有时
==false
有助于缩短代码:

对于使用C#2.0的项目中的实际场景,我认为这样做只有一个很好的理由:
bool?
type。三态
bool?
很有用,用这种方法很容易检查其中一个可能的值

实际上,如果
IsGood
bool?
,你就不能使用
(!IsGood)
。但是编写
(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){…}
不同。但这是不现实的;)运算符重载在这里可能有帮助:)(运算符true/false表示在C#2.0中不鼓励使用AFAIK,因为它的目的是为用户定义的类型提供类似bool的行为,现在您可以使用标准类型获得它!)

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

根据一本书,并高度重视以下是处理布尔值的方法

if (IsGood)
if (!IsGood)
我过去习惯于实际比较布尔值,但我想为什么要在这个过程中添加一个额外的步骤,并将布尔值视为二流类型。在我看来,比较返回一个布尔值,而布尔值类型已经是布尔值了,那么为什么不直接使用布尔值呢

真正的争论归根结底是为你的布尔对象起好名字。就像你在上面做的那样,我总是用我的布尔对象来回答一个问题。比如

  • 很好
  • HasValue
  • 等等
我更喜欢!IsGood方法,我想大多数c语言背景的人也会喜欢它。我只是在这里猜测,但我认为大多数写IsGood==False的人来自更详细的语言背景,比如Visual Basic。

在我看来(尽管我没有证据支持这一点)开始使用C#/java类型语言的人更喜欢“if(CheckSomething())”方法,而开始使用其他语言(C++:特别是Win32 C++)的人出于习惯倾向于使用另一种方法:在Win32中,如果CheckSomething返回BOOL(而不是BOOL),则“if(CheckSomething())”将不起作用;在许多情况下,API函数显式返回0/1 int/int,而不是真/假值(BOOL就是这个值)


出于习惯,我总是使用更详细的方法。它们在语法上是一样的;我不相信“冗长刺激我”的胡说八道,因为程序员不需要被代码打动(计算机需要).而且,在现实世界中,任何人看我写的代码的技能水平都会有所不同,我没有时间或倾向于向那些可能不理解像这样的小细节的人解释语句评估的特殊性。

我们在这里倾向于做以下工作:

if(IsGood)

这是因为我们有一些遗留代码是由一个不再在这里的家伙(在Delphi中)编写的,看起来像:

if not IsNotGuam then
这在过去给我们带来了很多痛苦,所以我们决定
if (IsGood)
if (!IsGood)
if(IsGood)
if(IsGood == false)
if not IsNotGuam then
public bool IsBad => !IsGood;
if (IsBad)
{
    ...
}
if (someBoolean == true) { /* ... */ }
if ((someBoolean == true) == true) { /* ... */ }
if (((someBoolean == true) == true) == true) { /* ... */ }
// 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
if (isGood != false) ...  // instead of using if (isGood == true)
if (IsGood)
if (!IsBad)
unless (IsBad)
raise InvalidColor unless AllowedColors.include?(color)
if (IsGood)
{
    DoSomething();
}
if (IsGood == false)
{
    DoSomething();
}
if (something) ...
if (something == true) ...
if (true == IsGood) {....
if ( true == FunctionCall()) {
  // stuff
}
/\b!IsGood\b/
/\bIsGood\s*==\s*false\b/
/\bIsGood\s*!=\s*true\b/
/\bIsGood\s*(?:==\s*false|!=\s*true)\b/
if (not foo ())
   bar ();
if (Flag == true)
if ((Flag == true) == true)
unless($isGood)