47

このようなチェックを行うコードを見続けています

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

またはこれ

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

私はこの構文が嫌いで、常に次の構文を使用しています。

if (IsGood)
{
   DoSomething();
}

また

if (!IsGood)
{
   DoSomething();
}

== true「 」または「 」を使用する理由はあります== falseか?

それは読みやすさの問題ですか?人々はブール変数を理解していないのでしょうか?

また、両者の間にパフォーマンスの違いはありますか?

4

41 に答える 41

103

私はあなたと同じ構文に従いますが、冗長ではありません。

人々 (より初心者) は== true、自分が望むものであることを確認するためだけに使用することを好みます。彼らは条件で演算子を使用することに慣れています...彼らはそれがより読みやすいと感じました。しかし、より高度になると、冗長すぎるため、イライラすることに気付きます。

于 2008-12-10T14:26:26.430 に答える
40

私は誰かに出くわすといつもくすくす笑います (気分によっては誰かに何かを投げつけます)

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

確かに、比較がブール値を返すという事実に依存できない場合は、結果を true と比較することにも依存できないため、コードは次のようになります。

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

もちろん、これは実際には

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

しかし、もちろん ...

(ああ、コンパイルに失敗しました。作業に戻ります。)

于 2008-12-10T15:55:45.297 に答える
32

私はより短い変種を好むでしょう。ただし== false、コードをさらに短くするのに役立つ場合があります。

C# 2.0 を使用するプロジェクトの実際のシナリオでは、これを行う正当な理由は 1 つだけbool?です。スリーステートbool?は便利で、この方法で可能な値の 1 つを簡単に確認できます。

(!IsGood)実際にはif IsGoodis は使えませんbool?。しかし、書くこと(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) { ... }が と同じではないことを発見したもう 1 つのケースがありif (IsGood == false) { ... }ます。しかし、これは現実的ではありません;) 演算子のオーバーロードは、ここで一種の助けになるかもしれません:) (そして、ユーザー定義型に bool? のような動作を提供することが意図されているため、AFAIK は C# 2.0 では推奨されていないことを true/false にします。スタンダードタイプで手に入る!)

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

だから...注意して演算子のオーバーロードを使用してください:(

于 2008-12-10T14:31:17.620 に答える
18

Code Completeによると、 Jeff が彼の名前を取得した本であり、次のように高く評価されています。ブーリアンを処理する方法は次のとおりです。

if (IsGood)
if (!IsGood)

私はブール値を実際に比較することに慣れていましたが、なぜプロセスに余分なステップを追加し、ブール値を二流のタイプとして扱うのかを考えました。私の見解では、比較はブール値を返し、ブール型はすでにブール値であるため、ブール値を使用しないのはなぜですか。

実際、議論の行き着く先は、ブール値に適切な名前を使用することです。あなたが上で行ったように、私はいつもブーリアンオブジェクトを質問の中で表現しています。そのような

  • いいね
  • HasValue
于 2008-12-10T14:35:27.347 に答える
15

特に C/C++ では、問題の変数が実際にブール値として使用されることになっている場合 (その型がブール値でなくても)、true または false に対して具体的にテストする手法は間違いなく悪い習慣です。に対するテスト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

true/false に対してブール値フラグとして使用される変数をテストする必要があると感じた場合 (これは私の意見では行うべきではありません)、常に false に対してテストするというイディオムを使用する必要があります0。 true は複数の可能な値を持つことができます ( 以外のもの0):

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

これは C/C++ の欠陥であると考える人もいますが、それは本当かもしれません。しかし、これはこれらの言語 (およびおそらく他の多くの言語) での現実であるため、整数値をブール値として使用できない C# のような言語でも、短いイディオムに固執します。

この問題が実際に誰かを噛んだ例については、このSOの質問を参照してください...

于 2008-12-10T16:39:09.373 に答える
13

私はあなたに同意します(また、それに悩まされています)。IsGood == trueと評価される のboolは、ほんのわずかな誤解だと思いますIsGood

私はよくこれらの近い例を目にしSomeStringObject.ToString()ます。

とはいえ、型をゆるく扱う言語では、これは正当化されるかもしれません。しかし、C# ではありません。

于 2008-12-10T14:27:19.530 に答える
9

読み取りによって変数の型を推測できるため、既知の値に対する明示的なチェックの方が読みやすいと感じる人もいます。どちらが優れているかは、私にはわかりません。どちらも機能します。変数が本質的に「逆」を保持している場合、値をチェックすることに引き寄せられるようです。

if(IsGood) DoSomething();

また

if(IsBad == false) DoSomething();

それ以外の

if(!IsBad) DoSomething();

しかし、繰り返しますが、それは私にとっては大した問題ではなく、最終的には同じ IL になると確信しています。

于 2008-12-10T14:29:21.103 に答える
7

これまでの回答から、これはコンセンサスのようです。

  1. ほとんどの場合、短い形式が最適です。(IsGood と !IsGood)
  2. ブール変数は、正として記述する必要があります。(IsBad の代わりに IsGood)
  3. ほとんどのコンパイラはどちらの方法でも同じコードを出力するため、インタープリター言語の場合を除き、パフォーマンスの違いはありません。
  4. この問題には明確な勝者がなく、コーディング スタイルの宗教戦争での戦いと見なされる可能性があります。
于 2008-12-10T17:19:52.320 に答える
7

読みやすさだけ..

どちらかといえば、マシンコードにコンパイルすると、好みの方法の方が効率的です。ただし、まったく同じマシンコードを生成すると思います。

于 2008-12-10T14:27:33.120 に答える
6

私は使用することを好みます:

if (IsGood)
{
    DoSomething();
}

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

これは読みやすいと思います-!見逃すのは簡単すぎます(読み取りと入力の両方で)。また、「If not IsGood then...」は、「if IsGood is false then...」とは対照的に、私が聞いたときに正しく聞こえません。

于 2008-12-10T17:20:25.907 に答える
5

C コードでは、TRUE と FALSE が 1 と 0 以外のものに対して #defined である可能性があります (可能性は低いですが、少なくとも私は願っています)。たとえば、プログラマーは 0 を "true" として使用し、-1 を "false " 特定の API で。同じことが従来の C++ コードにも当てはまります。これは、「true」と「false」が常に C++ キーワードであるとは限らなかったためです。特に、ANSI 標準が存在する前の時代にはそうでした。

また、一部の言語 (特に、Perl、JavaScript、PHP などのスクリプトを使用する言語) では、どの値が true と見なされ、どの値が false と見なされるかについておかしな解釈をする可能性があることも指摘しておく価値があります。"foo == false" が "!foo" とは微妙に異なる何かを意味する可能性はあります (ただし、これもまた、希望があるとは考えにくいことです)。この質問は「言語にとらわれない」とタグ付けされており、言語は == 演算子を定義して、! と互換性のある方法で機能しないようにすることができます。オペレーター。

于 2008-12-10T16:01:08.250 に答える
5

C/C++ スタイルの要件として、次のことがわかりました。

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

その理由は、誤って「==」の代わりに「=」を入力した場合、コンパイラーは値を定数に代入することを回避するためです。その間、すべての if ステートメントの可読性が損なわれます。

于 2008-12-10T18:51:43.007 に答える
4

時折、読みやすさの観点から使用されます。名前付き変数または関数呼び出しは、混乱を招く可能性のある二重否定になる場合があり、このように期待されるテストを明示的にすると、読みやすくなります。

この良い例は strcmp() C/C++ で、文字列が等しい場合は 0 を返し、そうでない場合は違いがどこにあるかに応じて < または > 0 を返します。そのため、次のことがよく見られます。

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

一般的に、しかし私はあなたに同意します

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

読みやすくなっています。

于 2008-12-10T14:28:58.827 に答える
3

The !IsGood pattern is eaiser to find than IsGood == false when reduced to a regular expression.

/\b!IsGood\b/

vs

/\bIsGood\s*==\s*false\b/
/\bIsGood\s*!=\s*true\b/
/\bIsGood\s*(?:==\s*false|!=\s*true)\b/
于 2008-12-10T19:18:37.807 に答える
3

読みやすくするために、他のプロパティに依存するプロパティを考えることができます。

public bool IsBad => !IsGood;

次に、実際に意味を理解できます。

if (IsBad)
{
    ...
}
于 2008-12-10T15:02:03.160 に答える
3

唯一悪いのは

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

その方法の背後にある考えを理解したことがありません。

于 2008-12-10T18:21:47.997 に答える
3

!IsGood私にとっては、それがより明確で簡潔であるため、私は好きです。boolean == trueただし、 a が冗長かどうかを確認するので、それは避けます。構文的には、 if をチェックする違いはないと思いますIsGood == false

于 2008-12-10T14:26:23.947 に答える
3

私は!IsGoodアプローチを好みます。また、C スタイル言語のバックグラウンドを持つほとんどの人も同様に好むと思います。ここでは推測にすぎませんが、IsGood == Falseを書いているほとんどの人は、Visual Basic のようなより冗長な言語のバックグラウンドを持っていると思います。

于 2008-12-10T14:37:22.100 に答える
2

多くの言語の違いは、コンパイラ/インタプリタに true または false の意味を指示させる場合と、コードによって定義する場合があります。Cがその良い例です。

if (something) ...

上記の例では、「something」がコンパイラの「true」の定義と比較されます。通常、これは「ゼロではない」ことを意味します。

if (something == true) ...

上記の例では、「something」が「true」と比較されます。「true」のタイプ (およびそのための比較可能性) と「true」の値の両方が、言語および/またはコンパイラ/インタプリタによって定義される場合と定義されない場合があります。

多くの場合、この 2 つは同じではありません。

于 2008-12-10T17:41:25.897 に答える
2

あなたが忘れてしまった:

if(IsGood == FileNotFound )

于 2008-12-10T21:55:46.787 に答える
1

たまたま perl で作業している場合は、次のオプションがあります。

unless($isGood)
于 2009-10-30T17:51:31.290 に答える
1

ああ、長い形式の方が小さい形式よりも読みやすいと主張して、長い形式を支持する同僚がいます。

私はそれを「修正」し始めました。ブール値は自己完結型であるため、十字軍をやめました... ^_^ とにかく、彼らはここでコードをクリーンアップするのが好きではなく、ブランチ間の統合が困難になると主張しています (それは本当ですが、その後、見栄えの悪いコードで永遠に生きます...)。

ブール変数名を正しく記述すれば、自然に次のように読めるはずです:
if (isSuccessful)vs.if (returnCode)

場合によっては、ブール比較にふけるかもしれません。たとえば、
if (PropertyProvider.getBooleanProperty(SOME_SETTING, true) == true)「自然に」読み取れないためです。

于 2008-12-10T16:30:18.910 に答える
1

なぜかずっと好きだった

if (IsGood)

より多い

if (!IsBad)

そういうわけで、私はRubyのが好きです(ただし、悪用するのは少し簡単すぎます)。

unless (IsBad)

次のように使用すると、さらに多くのことができます。

raise InvalidColor unless AllowedColors.include?(color)
于 2008-12-10T16:53:46.037 に答える
1

私は使用しませんが、頭の中でより明確になるため==、時々使用します。!=しかし、私の仕事では!=orは使用しません==hasXYZ()またはの場合に意味のある名前を取得しようとしますisABC()

于 2008-12-11T14:30:15.907 に答える
1

私には (これを裏付ける証拠はありませんが) C#/Java 型言語から始める人は "if (CheckSomething())" メソッドを好み、他の言語 (C++: 具体的には Win32) から始める人がいるようです。 Win32 では、CheckSomething が (bool ではなく) BOOL を返す場合、"if (CheckSomething())" は機能しません。多くの場合、API 関数は、真/偽の値 (BOOL とは) ではなく、0/1 の int/INT を明示的に返します。

私はいつも、習慣から、より冗長な方法を使用してきました。構文的には同じです。プログラマーはコードに感銘を受ける必要がある人ではないため (コンピューターは感銘を受けます)、私は「冗長性が私をいらいらさせる」というナンセンスを購入しません。そして、現実の世界では、私が書いたコードを見る人のスキルレベルはさまざまであり、重要でないことをほとんど理解していない人にステートメント評価の特殊性を説明する時間も傾向もありません。そのようなビット。

于 2008-12-10T14:42:16.427 に答える
1

あなたが本当に必要だと思うなら:

if (Flag == true)

条件式自体がブール値であるため、おそらく次のように展開する必要があります。

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

等々。この棺桶にはあと何本の釘が必要ですか?

于 2009-10-30T17:33:46.723 に答える
1

Cybis では、C++ でコーディングするときにnotキーワードも使用できます。これはずっと前から標準の一部であるため、このコードは完全に有効です。

if (not foo ())
   bar ();

編集:ところで、標準ではand(&&)、bitand(&)、または(||)、bitor(|)、xor(^)などの他のブールキーワードも定義されていることを忘れていました...それらは演算子と呼ばれます同義語。

于 2008-12-10T21:18:22.883 に答える
1

個人的には、Clean Code でボブおじさんが話している形式の方が好きです。

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

bool ShouldDoSomething()
{
    return IsGood;
}

最も些細なものを除いて、条件は述語関数に入れられます。その場合、ブール式の実装がどれほど読みやすいかはそれほど重要ではありません。

于 2008-12-10T14:30:18.497 に答える
0

isValidDate==trueのようなテストはオーバーネストにつながる可能性があると主張することができます。たとえば、ユーザーからの有効なデータがあることを検証するコードのブロックについて考えてみます。

if (isValidDate == true) {
    if (isValidQuantity == true) {
         if (isOtherThingValid == true) {
              bool result = doThing();
              if (result == true) {
                   thatWorked();
         } // long block of code that tries to compensate for OtherThing's invalidness
    } // obtuse function call to a third party library to send an email regarding the invalid quantity
} // is this the function close brace or the if...

これは私を夢中にさせます、それは部分的に私が逆に物事をする習慣を発達させた理由です:

if (isValidDate == false) {
    logThisProblem("Invalid date provided.");
    return somethingUseful;
}

if (isValidQuantity == false) {
    logThisProblem("Invalid quantity provided.");
    return somethingUseful;
}

if (isOtherThingValid == false) {
    logThisProble("Other thing not valid.");
    return somethingUseful;
}

// OK ... we've made it this far...
bool result = doThing(date, quantity, otherThing);
于 2009-10-16T00:33:24.160 に答える
0

実際的な違いではありませんが、私は常に == を数値演算子と見なしており、ブール型には適用できません。最も近いブール演算子は「等価」 (排他的論理和ではない) で、C スタイルの演算子はありません。

そうすれば、厳密にブール値のテストは次のようになります

if (!(IsGood ^ true))

ブール値の数値演算子の問題の実例として、ブール値の評価は何ですか

true / 2
于 2008-12-10T15:47:24.767 に答える
0

「ブール」型がないCのような言語では、より長い方法をお勧めします。

if (is_good == True)
{
}

その理由は、 is_good がtrue/だけでなくfalse(おそらく char として実装されている)、他の値によって破損したり、正しく設定されなかったりする可能性があるためです。

それで、これは何が良いですか?is_good== True または == False チェックがなければ、何でも true になるため、コードは正しく設定されていないという問題を拾うことができます;)そして、本当にブール値を意味するのであれば、それは悪いことです。

于 2008-12-12T22:10:02.333 に答える
0

1 つのサイズがすべてに適合するわけではありません。y が x の因数である場合に "True" を返す !(x % y) のように、より簡潔な形式を平易にしたり、慣用的にしたりできる場合があります。

また、より明示的な比較がより役立つ場合もあります。[(x, y) for x in range(10) for y in range(10) if not (x and y)] は [(x, y) for x in range(10) for y in range ほど単純ではない(10) (x == 0 または y == 0) の場合]

于 2008-12-11T08:56:40.400 に答える
0

より複雑なコードが意味をなすと考えることができるのは、true と false が実際には整数 (true=-1、false=0) であり、ブール式がゼロに評価された場合に false と見なされ、その他のゼロ以外の値の場合は true。そのため、古い VB の場合、リストされている 2 つのメソッドは実際には同等ではありませんでした。-1 と評価された場合にのみ何かを true にしたい場合は、明示的に「true」と比較する必要がありました。そのため、「+1」と評価される式は、整数として評価された場合 (ゼロではないため) true になりますが、「true」と同等ではありません。VB がそのように設計された理由はわかりませんが、古い VB コードでは、変数を true と false で比較するブール式がたくさん見られます。

于 2008-12-10T15:12:40.923 に答える
0

変数の命名に応じて、さまざまなスタイルを使用するのが好きです。たとえば、次のようになります。

Is、Has などの接頭辞を付けて名前を付けた変数は、名前を見ると明らかで、私が使用するブール値です。

if(IsSomething)

しかし、そのようなプレフィックスを持たない変数がある場合は、使用したい

if(Something == true)

どちらの形式を使用する場合でも、使用するプログラミング言語に基づいて決定する必要があります。

if(Something) and if(Something == true)

異なるプログラミング言語では非常に異なる意味を持つ可能性があります。

于 2008-12-13T16:53:30.303 に答える
0

2 つの形式は意味的に同一であり、同じマシン コードを生成します。

if (IsGood == false)よりも優れていif(!IsGood)ます。

コードをスキャンするとき、「!」を間違えやすいです。bool 変数内の文字の bool 変数の前。

于 2008-12-10T16:08:12.277 に答える
0

頻繁ではありませんが、それが実際に役立つ場合もあります。

これが例です。Actionscript 2 では、ブール値には 3 つの可能な値があります。

  • 真実
  • 間違い
  • null/未定義

オプションのブール引数を取るメソッドでは、通常、次のようなことを行います。

function myFunc(b:Boolean):Void {
  if(b == true) {
    // causes b to default to false, as null/undefined != true
  }
}

また

function myFunc(b:Boolean):Void {
  if(b != false) {
    // causes b to default to true, as null/undefined != false
  }
}

値をデフォルトにしたいものに応じて。ブール値を複数回使用する必要がある場合は、次のようにします。

function myFunc(b:Boolean):Void {
  b = (b == true); // default to false
}

また

function myFunc(b:Boolean):Void {
  b = (b != false); // default to true
}
于 2008-12-10T16:10:04.893 に答える
0

言語によるところが大きいと思います。

たとえば、PHP では、特定の関数が false を返したり、負でない数値を返したりすることがあります。

そうして:

if(foo(bar)) { ... }

false が返されるか 0 が返されるかがわからないため、スキームはうまく機能しません。

この厄介な小さな FUBAR を持たない他の言語では、どちらの形式でも受け入れられると思います。

于 2008-12-10T22:10:16.570 に答える
0

ここでは、次のことを行う傾向があります。

if(IsGood)

また

if(IsGood == false)

その理由は、もうここにはいない (Delphi の) 人によって書かれた、次のようなレガシー コードがあるからです。

if not IsNotGuam then

これは過去に私たちに多くの苦痛をもたらしました。それが不可能な場合は、否定を偽と比較します。

于 2008-12-10T14:43:55.317 に答える
0

私たちがどちらかを持っている限り、if (isGood)またはif (!isGood)それは問題ありません。

ときどき、このようなコードに出くわします...

if (!getGreatGrandFateher.getGrandFather().getFather().getFirstChild().isMale())
{
   doSomething();
}

これは一見、doSomething男性と呼ばれる誤解を招きます。小さな '!' 上記のような大きなコード構成で「if」が失われた後。

以下のような明示的なチェックにより、読みやすさが向上します

if(getGreatGrandFateher.getGrandFather().getFather().getFirstChild().isMale() == false)
{
   doSomething();
}
于 2008-12-11T08:13:35.447 に答える
-1

Coding in C#/C++/Java/etc... I always prefer

if (something == true)
if (something == false)

over

if (something)
if (!something)

because the exclamation point is just difficult to see at a glance unless I used a large font (but then I'd see less code on the page - not all of us can afford 24"+ monitors). I especially don't like being inconsistent and using if (something) and if (something == false)

When I code in Python, however, I almost always prefer

if something:
if not something:

because the 'not' is plainly visible.

于 2008-12-10T19:12:44.337 に答える
-2

私は...するだろう

if (isGood) {
  doSomething();
}

if (isNotGood) {
    doSomethngElse();
}

読みやすくなります。

于 2009-10-16T00:41:57.233 に答える