Должен ли я использовать `! IsGood` или` IsGood == false`? - PullRequest
46 голосов
/ 10 декабря 2008

Я постоянно вижу код, который проверяет, как это

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

или это

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

Я ненавижу этот синтаксис и всегда использую следующий синтаксис.

if (IsGood)
{
   DoSomething();
}

или

if (!IsGood)
{
   DoSomething();
}

Есть ли причина использовать '== true' или '== false'?

Это удобочитаемость? Люди просто не понимают булевых переменных?

Кроме того, есть ли разница в производительности между ними?

Ответы [ 41 ]

5 голосов
/ 10 декабря 2008

Возможно (хотя и маловероятно, по крайней мере, я надеюсь), что в коде C TRUE и FALSE # определены для вещей, отличных от 1 и 0. Например, программист, возможно, решил использовать 0 как «true» и -1 как «ложь» в конкретном API. То же самое относится и к унаследованному коду C ++, поскольку «true» и «false» не всегда были ключевыми словами C ++, особенно в тот день, когда существовал стандарт ANSI.

Стоит также отметить, что некоторые языки, особенно такие как script-y, как Perl, JavaScript и PHP, могут смешно интерпретировать, какие значения считаются истинными, а какие - ложными. Возможно (хотя, опять-таки, вряд ли на надежде), что «foo == false» означает что-то немного отличное от «! Foo». Этот вопрос помечен как «независимый от языка», и язык может определить оператор ==, чтобы он не работал способами, совместимыми с! оператор.

5 голосов
/ 10 декабря 2008

Я видел следующее как требование стиля C / C ++.

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

Причина была в том, что если вы случайно поставили "=" вместо "==", компилятор возьмет под залог присвоение значения константе. В то же время это ухудшает читабельность каждого оператора if.

4 голосов
/ 10 декабря 2008

Иногда он использует с точки зрения читабельности. Иногда именованная переменная или вызов функции могут в конечном итоге быть двойным отрицательным, что может сбить с толку, и сделать ожидаемый тест явным, как это, может улучшить читаемость.

Хорошим примером этого может быть strcmp () C / C ++, который возвращает 0, если строки равны, иначе <или> 0, в зависимости от того, где находится различие. Так что вы часто будете видеть:

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

Обычно, однако, я бы согласился с вами, что

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

понятнее.

3 голосов
/ 10 декабря 2008

Для удобства чтения вы можете рассмотреть свойство, которое зависит от другого свойства:

public bool IsBad => !IsGood;

Тогда вы действительно можете понять значение:

if (IsBad)
{
    ...
}
3 голосов
/ 10 декабря 2008

Я предпочитаю подход ! IsGood , и я думаю, что большинство людей с языком в стиле c также предпочтут его. Я только догадываюсь здесь, но я думаю, что большинство людей, которые пишут IsGood == False , пришли из более многословного языка, как Visual Basic.

3 голосов
/ 10 декабря 2008

Я предпочитаю !IsGood, потому что для меня это более понятно и лаконично. Проверка избыточности boolean == true, поэтому я бы этого не делал. Синтаксически, однако, я не думаю, что есть разница, проверяющая, если IsGood == false.

3 голосов
/ 10 декабря 2008

хуже только

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

Никогда не понимал, что стоит за этим методом.

3 голосов
/ 10 декабря 2008

Шаблон !IsGood легче найти, чем IsGood == false, если его уменьшить до регулярного выражения.

/\b!IsGood\b/

против

/\bIsGood\s*==\s*false\b/
/\bIsGood\s*!=\s*true\b/
/\bIsGood\s*(?:==\s*false|!=\s*true)\b/
2 голосов
/ 10 декабря 2008

Во многих языках разница в том, что в одном случае компилятор / интерпретатор диктует значение true или false, а в другом случае оно определяется кодом. C является хорошим примером этого.

if (something) ...

В приведенном выше примере «что-то» сравнивается с определением компилятора «true». Обычно это означает «не ноль».

if (something == true) ...

В приведенном выше примере «что-то» сравнивается с «истиной». Тип «истина» (и, следовательно, сопоставимость) и значение «истина» могут определяться или не быть определены языком и / или компилятором / интерпретатором.

Часто они не одинаковы.

2 голосов
/ 11 декабря 2008

Вы забыли:

if (IsGood == FileNotFound )

...