Использование true и false в качестве выражений в условной операции
Я поддерживаю некоторый код и нашел следующий шаблон:
var isMale = (row["Gender"].ToString() == "M") ? true : false;
вместо этого:
var isMale = (row["Gender"].ToString() == "M");
Есть ли причина, по которой кто-то будет это делать? Кто-нибудь думает, что первое более читаемо или яснее? Есть ли какая-то старая C "gotcha", что это удержание?
Ответы
Ответ 1
Допустимая причина? Нет.
Он обычно создается людьми, которые на самом деле не понимают, что условие также само по себе является выражением, производящим логический результат. В частности, люди учились на языке, где это не так, например, многие варианты BASIC.
Ответ 2
Я думаю, если вы заплатите персонажем, который будет действителен. Помимо этого я не могу придумать никаких причин.
Ответ 3
Если вы не можете доверять: (row["Gender"].ToString() == "M")
к правильному или ложному правилу продукта, то вы, вероятно, не можете действительно доверять: (row["Gender"].ToString() == "M") ? true : false;
. Разумеется, вам, несомненно, нужно повторить его хотя бы несколько раз:
(row["Gender"].ToString() == "M") ? true : false ? true : false ? true : false;
Опять же, возможно, вы не можете доверять комбинации ==
и ?:
сами по себе - чтобы быть уверенным действительно, вам, вероятно, потребуется как минимум немного избыточность:
if ((row["Gender"].ToString() == "M") ? true : false ? true : false ? true : false == true)
isMale = true == true;
else
isMale = false != false;
Хм... может, я слишком поздно пробыл прошлой ночью...: -)
Ответ 4
Я думаю, что это полностью избыточно.
В моем опыте это часто происходит, когда условное утверждение развивается со временем и заканчивается явным истинным или ложным, а не подзаголовком.
Ответ 5
Я думаю, некоторым людям не удобно назначать что-либо другое, что true
или false
для логической переменной. Не знаю, почему это так, но я это наблюдал довольно много раз.
Итак, из этого аспекта это выглядит так:
установить сарказм на
bool isMale = (row["Gender"].ToString() == "M"); //BAAAAD
но
bool isMale = (row["Gender"].ToString() == "M") ? true : false; //BETTER
и
bool isMale;
if (row["Gender"].ToString() == "M")
isMale = true;
else
isMale = false; // BEST!
установить сарказм
К счастью, Resharper делает короткую работу со всеми этими анти-шаблонами.
Ответ 6
if (somebool) return true;
else return false;
"pattern" получает смех в значительной степени везде, где я когда-либо работал. Нет причин делать это, на мой взгляд.
Ответ 7
Применение тернарного оператора?: выражение, которое может оценивать только true/false (x==y
), просто избыточно (оно просто избыточно [оно избыточно]).
Вышеприведенное предложение может быть легче читать для тех, кто не очень хорошо понимает английский, поскольку они будут знать, что искать первым в словаре и, если говорить, из-за повторения. Однако для носителей английского языка предложение неудобно и, ну, лишнее.
В вашем примере либо оператор используется для целей документирования, либо без смысла оскорблять, я подозреваю, что плохое понимание того, как работают операторы и выражения.
Если это недостаток понимания или какая-то причудливая попытка документирования, мы можем сделать это без избыточных операторов следующим образом:
var isMale = (row["Gender"].ToString() == "M"); // bool
или...
var isMale = (row["Gender"].ToString() == "M"); // true/false
... или еще лучше, явно укажите соответствующий тип для 'isMale' вместо того, чтобы полагаться на неявное типирование:
bool isMale = (row["Gender"].ToString() == "M");
Я также видел, как люди пессимизировали свой код таким образом (или используя if/else):
bool something = some_int ? true: false;
Нет необходимости делать это, и, хотя компилятор может оптимизировать это, по своей сути менее эффективно полагаться на механизмы ветвления над чем-то простым:
bool something = some_int != 0;
..., который имеет тот же эффект, но без обходного процесса использования условного разветвления.
Этот вид кода просто смущает. Это похоже на:
switch (x)
{
case 1:
y = 1;
break;
case 2:
y = 2;
break;
case 3:
y = 3;
break;
// etc. for all possible values of x
}
Вышеупомянутое, безусловно, будет считаться кодом uber-n00b большинством, но оно не является менее избыточным логически, чем x == y ? true: false
или x ? true: false
(в отличие от x != 0
).
Ответ 8
Определенно избыточно. Может быть, остальная практика с другого языка/среды программирования, которую сохранил первоначальный разработчик. Я также мог бы увидеть, как разработчик просматривает первую строку, поскольку она более читаема, поскольку он/она может быстро увидеть, что она устанавливает логическое значение при проскальзывании кода.
Ответ 9
2-й способ уверен, имеет смысл, и мне кажется, что его легче читать.
Второй способ немного умнее. Я бы не пропустил мимо меня, чтобы сделать что-то вроде того, что ты находишь, если я собираю код в пятницу днем, и мой мозг уже ушел на выходные: -)