Что является более понятной формой: if (! Value) или if (flag == value)? - PullRequest
54 голосов
/ 04 июня 2010

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

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

Не оператор

if (!value)

Или тест на ложь

if (value == false)

Ответы [ 18 ]

1 голос
/ 05 июня 2010

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

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

if(pane.IsChecked)

по-английски читается как «Если флажок установлен».

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

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

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

1 голос
/ 05 июня 2010

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

1 голос
/ 05 июня 2010

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

0 голосов
/ 05 июня 2010

Я на самом деле много возможных форм.

На самом деле это не так, как написано в стандартах, но я вижу это так:

//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)

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

0 голосов
/ 05 июня 2010

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

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

0 голосов
/ 26 января 2018

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

0 голосов
/ 11 августа 2018

Независимо от того, какое условие блок if должен оценить для выполнения, оно должно быть равно true.

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

if (value), if (!value), if (flag == value), if (value == true), if (value == false), в зависимости от того, что должно быть достигнуто, являются действительными кодами.Например, if (value == true) очень полезен, когда value является логическим значением, допускающим значение NULL, потому что if (value) выдаст синтаксическую ошибку, а if (value.Value == true) выдаст исключение, если вы не гарантировали, что value не равно нулю до if блок выполнен.

0 голосов
/ 05 июня 2010

Извините, второй кажется мне глупым.

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

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

:)

...