Подтвердить что ты не робот

Какая более ясная форма: if (! Value) или if (flag == value)?

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

Очевидно, что лучшим ответом является "рефакторинг кода, поэтому вам не нужно проверять ложность", но иногда нет простого способа сделать это, а ветка "else" - просто продолжить обработку. Поэтому, когда вы должны иметь конструкцию "if not false", которая является предпочтительным стандартом:

Не оператор

if(!value)

Или тест для false

if(value == false)
4b9b3361

Ответ 1

if(!value) легче/быстрее следовать. Субъективно, как вы сказали. Пока вы последовательны, это главное.

ИЗМЕНИТЬ

Еще один момент добавления - исключение ключевых слов true/false также должно (надеюсь) заставить кодера использовать более известные именованные переменные. Переменные Bool всегда должны указывать смысл или цель, например:

if(MyWallet.IsEmpty)

Нет причин для использования == false или == true, поскольку это избыточно. Вышеприведенное является понятным для человека.

Намного лучше, чем расшифровать:

if(MyWallet.EmptyStatus == true) или что-то нелепое.

Ответ 2

Мне лично нравится

if ((value == false) == true)...

потому что это проверяет, что оператор value is false фактически вычисляет логическое значение true...

и, следовательно, очевидно, что покрытие обоих posssibilites добавляет еще большей ясности,

if ((value == false) == true && (value == false) != false)

<grin/>

и для тех из вас, кто является настоящими обжорами для ясности, и требуйте неопровержимой читаемости, я бы предложил

if (((value == false) == true && (value == false) != false) == true)

Ответ 3

if(!value)

Это всегда яснее, на мой взгляд.

if(value == false)

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

(Лично я был бы раздражен и у человека, если бы они назвали переменную value вместо чего-то более значимого. У меня такое чувство, что вы опубликовали только код psuedo, я бы определенно подумал об этом в обзоре.)

Изменить (в ответ на комментарий ниже):

Это может показаться тривиальным, но часто это признак гораздо больших вещей. По правде говоря, большинство людей, которые используют var == true и т.д., Не понимают. Это просто факт. Я не говорю, что они глупы, или они не должны быть программистами именно в том, что, возможно, что-то, что им нужно пересмотреть и изучить. Проблема в том, что когда логика становится намного сложнее, не понимая подобных концепций, это может привести к гораздо большим проблемам в будущем. Некоторые люди говорят "это стиль". Это здорово. Реальный вопрос в этом случае: "Как мне выгодно это делать так? Что я или другие люди получают от этого?" Если вы не можете твердо ответить на этот вопрос, тогда вам нужно спросить себя: "Почему это хорошая идея?"

Ответ 4

Я бы никогда не использовал if(value == true), поэтому просто для согласования я бы также не использовал if(value != false).

Ответ 5

if(!value) более четкий и более "элегантный", особенно если вы правильно назовете логические переменные

  • isWhatever
  • hasWhatever
  • и т.д.

Что-то вроде

if (Page.IsPostback == true)

кажется излишним для меня

Ответ 6

Особое мнение (вид)

С точки зрения компиляции, вы получите тот же IL, так что это действительно имеет значение только с точки зрения читаемости.

С этой точки зрения if(value == false) более очевидна для случайного читателя, и меньше шансов пропустить! перед bool.

Честно говоря, я использую оба подхода, и в большинстве случаев я зависеть от имени переменной. Если по-прежнему звучит нормально, чтобы сказать "не" вместо "взрыва", я, скорее всего, воспользуюсь обозначением взлома

например.

if(!gotValue) {}
//if (I've) not gotValue

//but

if(checkValue == false){}
//If (I've) not checkValue doesn't quite work here grammatically.

Ответ 7

Я использую Not value при кодировании в VB, но при кодировании на С# вы используете value == false. Я считаю, что восклицательный знак иногда может быть потерян во имя переменной (например, законной). Может быть, потому, что я... опытный ветеран.

Ответ 8

Я не думаю, что все это субъективно. Я никогда не видел, чтобы это рекомендовалось в более длинной форме. На самом деле все книги и руководства по кодированию и "Как быть хорошим программистом" HowTos, который я прочитал, препятствуют этому.

Он попадает в ту же категорию, что и

if (value) {
  return true;
} else {
  return false;
}

OTOH, все ответы, приведенные здесь, делают мое первое утверждение вроде равным не истинным.

Ответ 9

Обычно я предпочитаю if (! value), когда я точно знаю, что значение является логическим. Но много раз это может быть строка или число.

Число ноль будет оцениваться как false в условных выражениях на множестве языков (не все); однако строка "0" будет равна true. Это проблема, особенно в JavaScript, особенно если вы получаете строки JSON с сервера, особенно если сервер написан на PHP (потому что большинство разработчиков PHP небрежно достаточно просто взять значения из БД и вызвать json_encode на них, не зная, что DB дает строки и не имеет понятия, что все те нули и те, которые они используют в качестве логических полей, будут закодированы как строки на другом конце, поэтому все они считаются истинными в условных выражениях).

Повторите. Мое предложение: быть явным, особенно если ваш язык является "очень динамичным" типом (например, JavaScript, PHP, Perl).

Ответ 10

Независимо от того, что вы предпочитаете. Выберите один и придерживайтесь его.

Ответ 11

Я бы предпочел использовать if(!value), потому что, в зависимости от имен задействованных переменных, "истинный" случай имеет гораздо больше смысла в соответствии с английской семантикой.

Рассмотрим один из примеров в этой статье MSDN:

if(pane.IsChecked)

читается на английском языке как "Если панель отмечена".

Однако, если (pane.IsChecked == true) читается на английском языке как "Если установлена ​​проверка панели, это правда". Это утверждение, которое на русском языке гораздо менее очевидно, чем должно быть.

Одна из причин, почему мы не пишем код С# в двоичном формате, - это читаемость человека. Если вам предоставлен выбор между кодом, который хорошо переносится, когда вы читаете его, а код - нет, бок с тем, который более читабельен. Я не думаю, что добавление "== true" делает этот пример более читабельным, и MSDN тоже не думает.

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

Ответ 12

Я предпочитаю стиль if (!value), по крайней мере, для оценки переменных или общих свойств, таких как Page.IsPostback и тому подобное. Для чего-то более сложного я склоняюсь к заключению в скобки выражения, например:

if (!(SomeType.SomeProperty.CallingAMethod(input).GetSomething.BooleanProperty))

Просто обратим на него немного больше внимания.

В целом, это аргумент для ключевых слов unless и until для Perl.

Ответ 13

Я предпочитаю второй вариант, if (value == false) один. Я с удовольствием использую if (~value) или if (not value) на языках, которые его поддерживают, но что ! просто слишком легко сглаживает waaaaay либо с именем переменной, либо с открывающей скобкой или | или || операторов... по крайней мере, на мой взгляд.

Кроме того, две вещи:

  • Я никогда не делаю if (value == true), и я знаю, что я не согласен. И хотя согласованность очень важна, на мой взгляд, что надоедливый ! просто хуже.
  • Я думаю, что это действительно вопрос личного вкуса, точно так же, как дебаты о битках на новой. Я бы никогда не критиковал товарища по команде за такие глупые мелочи, и я с трудом понимаю людей, которые будут.

Ответ 14

Если условие является просто проверкой одного значения, то !value выполняется быстрее.

Однако, когда условие содержит несколько проверок значений, мне гораздо легче читать value == false. Как-то проще разобрать несколько проверок на равенство, чем несколько отрицаний значений.

Ответ 15

Я сожалею, что второй выглядит глупо для меня.

Я бы добавил дополнительный уровень, если кто-то его предпочитает:

if( (value==false) == true )

:)

Ответ 16

На самом деле, возможно, многие формы.

На самом деле это не так, как написано на стандарты, но я так понимаю:

//if foo is(or exists)
if(foo)

//if foo is true
if(foo == true)

//if foo doesn’t exist
if(!foo)

if foo is false
if(foo == false)

Следовательно, я не вижу, что == false избыточно.