2010-09-10 2 views
10
bool foo = true; 

// Do this? 
if (foo) 
{ 
} 

// Or this? 
if (foo == true) 
{ 
} 

Мне нравится, когда один из них и мой коллега другой. Результат тот же, но что (больше) правильно?Проверьте, истинно ли логическое значение?

+0

Это вопрос стиля. Я сомневаюсь, что вы получите окончательный ответ на этот вопрос. – Robaticus

+0

Хотел бы я проголосовать, чтобы закрыть как общий дубликат. Есть waaaaaaay слишком много вопросов по этому поводу, и все они одинаково субъективны. – BoltClock

+11

Jon Skeet нравится первый. Таким образом, это правильный путь ... конец обсуждения! ;-) –

ответ

33

Почти все, что я видел выражение мнения предпочитает

if (foo) 
{ 
} 

В самом деле, я видел много людей критикуют явное сравнение, и я, возможно, даже сделать так себе до сих пор. Я бы сказал, что «короткий» стиль идиоматичен.

EDIT:

Обратите внимание, что это не означает, что строка кода всегда неправильно. Рассмотрим:

bool? maybeFoo = GetSomeNullableBooleanValue(); 
if (maybeFoo == true) 
{ 
    ... 
} 

Это будет компилировать, но без «== правда» не будет, так как нет неявного преобразования из bool? в bool.

+3

Согласовано. Единственный раз, когда я использовал подробный (foo == true), является то, что имя переменной foo не является, очевидно, логическим, просто для удобочитаемости. –

+0

+1 для комментария 'bool?'. Я использовал '(возможно, Foo.HasValue && maybeFoo.Value)', но 'maybeFoo == true' намного приятнее. – fredw

+1

@fredw: Еще один вариант - добавить значение по умолчанию: 'if (возможноFoo ?? false)' или 'if (возможноFoo ?? true)'. Но я предпочитаю «==» вообще. –

23

Это зависит от вашей ситуации.

Я хотел бы сказать, если ваш BOOL имеет хорошее имя, а затем:

if (control.IsEnabled) // Read "If control is enabled." 
{ 
} 

бы предпочтительнее.

Если, однако, переменная имеет не столь очевидное имя, проверка на true была бы полезной для понимания логики.

if (first == true) // Read "If first is true." 
{ 
} 
+10

+1 читаемость должна вести ответ - в идеале вы бы переименовали переменную, чтобы вы могли использовать ее. – RedFilter

+23

Если имя не очевидно, возможно, оно должно быть переименовано ... –

+0

При работе со встроенными системами часто нужно проверить состояние одного бита. В C# вполне разумно хранить бит как логическое. В этом случае проверка правильности логического значения может обеспечить более удобочитаемость, чем переименование переменной. Например, рассмотрим бит, который указывает, должны ли данные вводиться или выводиться. Вы можете назвать переменную 'IsOutputBit', но ее можно назвать более понятной как' IODirection'. Я признаю, что для этих целей может быть даже лучше создать перечисление на 2 значения. –

3

Первый пример почти всегда побеждает в моей книге:

if(foo) 
{ 
} 

Это короче и более кратким. Зачем добавлять дополнительную проверку к чему-то, когда это абсолютно не нужно? Просто расточительные циклы ...

Я согласен, однако, что иногда более подробный синтаксис делает вещи более читабельными (что в конечном счете более важно, если производительность приемлема) в ситуациях, когда переменные плохо названы.

2

Оба правильные.

У вас, вероятно, есть некоторый стандарт кодирования в вашей компании - просто посмотрите, чтобы следовать ему. Если у вас нет - вы должны :)

+4

Стандарт кодирования, который законодательно закрепляет такие вещи, является «организационным запахом» –

+2

Стандарты кодирования с этим уровнем управления микроорганизмами меня раздражают. – RedFilter

+1

@Steve Townsend: С другой стороны, десять разных стилей кодирования в одном файле - это «(dis) организационное зловоние» и их трудно читать. – Piskvor

1

я лично предпочел бы

if(true == foo) 
{ 
} 

нет шансов для ==/= опечаткой и я считаю его более выразительным с точки зрения типа Foo в. Но это очень субъективный вопрос.

+0

Но это C# и 'if (foo = true)' будет генерировать ошибку времени компиляции. – ChrisF

+3

@ChrisF: Нет, не будет. Результатом «foo = true» по-прежнему является bool, так что это нормально для условия «if». Однако он * генерирует предупреждение в компиляторе MS. –

+1

Зачем останавливаться здесь, когда вы могли бы сделать "if (true == (true == (true == foo)))"? Разве это не было бы более выразительным? ;) – Henrik

0

Не является также «более правильным». Мои личные предпочтения касаются более сжатой формы, но все в порядке. Для меня жизнь слишком коротка, чтобы даже подумать о том, чтобы спорить о таких вещах.

11

Если вы собираетесь выбрать

if(foo == true) 

почему бы не пройти весь путь и сделать

if(foo == true == true == true == true == true == true == true == true == true) 

что то же самое.

Я не согласен с тем, что если его четко обозначить (то есть: IsSomething), то его нормально сравнивать с истинным, но в противном случае вы должны. Если его в выражении if, очевидно, можно сравнить с истинным.

if(monday) 

столь же информативными

if(monday == true) 

Я также предпочитаю тот же стандарт: не

if(!monday) 

в отличие от

if(monday == false)