Затрудняюсь, если выражение?

Я всегда использую оператор If (In С#) как (1. Alternative);

if (IsSuccessed == true)
{
   //
}

Я знаю, что нет необходимости писать "== true" как (2. Альтернатива));

if (IsSuccessed)
{
   //
}

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

Ответы

Ответ 1

Если имя логического значения делает его совершенно ясным, что это такое, тогда я всегда выбираю версию 2. Однако иногда вы застряли с особенно тупым именем переменной, которое вы не можете изменить, по крайней мере, не может измениться прямо сейчас... Рефакторинг - все хорошо и хорошо, но я стараюсь избегать рефакторинга слишком сильно при внесении функциональных изменений в код.

Например:

if (!NoDropDownInHeader == true)
{
  // Activates when there *is* a dropdown in the header)
}

Я действительно видел этот конкретный пример в производственном коде и упростил его до:

if (NoDropDownInHeader == false)
{
 // Activates when there *is* a dropdown in the header
}

И я лично считаю, что оба примера более читабельны (хотя, возможно, первый пример может сравниться с этим для сложности разбора ума):

if (!NoDropDownInHeader)
{
 // Activates when there *is* a dropdown in the header
}

Примечание: Да, я знаю, что переменная плохо названа, но ее изменение во множестве мест, которые она присутствовало, выходит за рамки изменений, которые я делал из-за количества мест если это повлияет.

Ответ 2

Мне не нравится первый вариант. Это не только избыточно, но и простая опечатка приведет к ошибке.

Рассмотрим это

bool b = false;

if (b = true) {
   Console.WriteLine("true");
}

Очевидно, что код выводит "true", но это, вероятно, не было целью программиста.

К счастью, такие инструменты, как Resharper, предупреждают об этом, но он компилируется с настройками по умолчанию (*).

Использование bool напрямую удалит проблему полностью.

(*) Чтобы быть справедливым, VS также предупреждает об этом, и если вы включите Warnings как ошибки, он даже не будет компилироваться.

Ответ 3

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

Ответ 4

Полностью зависит от стиля. Шутки в сторону. Идите с тем, что вам нравится для ваших собственных вещей, независимо от того, какой у вас стиль общения.

Ответ 5

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

В конце концов, кто-нибудь каждый использует следующую идиому? "Если его дождь завтра будет ложным, мы можем пойти купаться" - НЕТ, конечно нет. никто не говорит что-то вроде этого, это смешно. Какой аргумент поддерживает утверждение о том, что эта идиома внезапно становится ясной при применении в программировании (в отличие от естественного) языка?

Ответ 6

Я предпочитаю вторую альтернативу. Я думаю, что это более читаемо, но первая альтернатива имеет то преимущество, что вам нужно использовать Boolean? по какой-то причине.

Ответ 7

Раньше я писал "== true", потому что я думал, что он яснее и яснее, но решил измениться. Теперь это всегда кажется намного понятнее, вы просто привыкнете к нему.

Ответ 8

Я бы согласился и на ваш второй вариант. По-моему, нет необходимости писать

if (IsSuccessed == true) 
{ 
   // 
} 

На самом деле, мне совершенно не нравится использование == true для логического, поскольку он не имеет дополнительного значения. И: вам нужно набрать меньше символов, что, очевидно, является преимуществом: p. Честно говоря, я бы также переписал логическое значение bSuccessed, так как он является логическим.

Ответ 9

Два выражения эквивалентны в С#, но имейте в виду, что на других языках они не являются.

Например, в С++ первая опция принимает только логическое значение со значением true. Любое другое значение в IsSuccessed приведет к недействительности условия.

Вторая опция принимает любое значение, которое является "правдивым": значения, подобные 1 или любые ненулевые, также считаются допустимыми для if.

Таким образом, эти условия подтвердят:

// Truthy validation (second option)
if(1) {...} //validates
if(2) {...} //validates

Пока эти другие не будут:

// Equals to true validation (first option)
if(1==true) {...} // does not validate
if(2==true) {...} // does not validate

Опять же, это не относится к С#, поскольку он принимает только booleans на ifs. Но имейте в виду, что другие языки принимают больше, чем просто булевы.

Ответ 10

Более типизация означает больше шансов на ошибки. Вариант 2 полностью...

Ответ 11

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

Ответ 12

Я пойду за вторым. Мне это по крайней мере легче. В первом варианте я всегда удивляюсь, почему делается сравнение. Проверьте тип левой стороны, чтобы убедиться, что ни один разработчик на кислоте не перегрузил оператор ==, делающий сравнение между его классом и bool опцией.
Первый также приводит к ошибкам, второй не будет.
if(a) может потребоваться изменить на if(a||b) или if(a&&b) в первой версии, которая может закончиться так: if(a == true || b) и if(a == true && b) в предыдущем b является избыточной, а последняя равна if(a==b)

Ответ 13

Что я вижу больше всего: (что я делаю)

if (IsSuccessed)
{
   //
}

и как альтернатива для С++, для С# он не нужен (см. комментарий):

if (true == IsSuccessed)
{
   //
}

Альтернатива заключается в том, чтобы не допустить, чтобы ошибка была назначена вместо сравнения. (= vs ==)