Смущает ли заявление? - PullRequest
       25

Смущает ли заявление?

12 голосов
/ 09 марта 2010

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

if (IsSuccessed == true)
{
   //
}

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

if (IsSuccessed)
{
   //
}

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

Ответы [ 13 ]

25 голосов
/ 09 марта 2010

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

Учтите это

bool b = false;

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

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

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

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

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

19 голосов
/ 09 марта 2010

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

8 голосов
/ 09 марта 2010

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

7 голосов
/ 09 марта 2010

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

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

6 голосов
/ 09 марта 2010

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

4 голосов
/ 09 марта 2010

Если имя логического значения дает полное представление о том, что это такое, то я всегда выбираю версию 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
}

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

3 голосов
/ 09 марта 2010

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

2 голосов
/ 10 марта 2010

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

2 голосов
/ 09 марта 2010

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

Например, в C ++ первый параметр принимает только логическое значение со значением 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

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

2 голосов
/ 09 марта 2010

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

if (IsSuccessed == true) 
{ 
   // 
} 

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...