Использование true и false в качестве выражений в условной операции

Я поддерживаю некоторый код и нашел следующий шаблон много:

var isMale = (row["Gender"].ToString() == "M") ? true : false;

вместо этого:

var isMale = (row["Gender"].ToString() == "M");

есть ли какая-либо причина почему кто-нибудь сделал бы это? Кто-нибудь думает, что первое более читаемо или яснее? Есть ли какой-то старый C "gotcha", от которого это удержание?

9 ответов


веская причина? Нет.

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


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


если вы не можете доверять:(row["Gender"].ToString() == "M") к продукту true или false правильно, тогда вы, вероятно, не можете действительно доверять:(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;

Мда...может, я вчера слишком поздно легла... :-)


Я думаю, что это совершенно излишне.

по моему опыту, это часто происходит, когда условный оператор эволюционирует с течением времени и заканчивается с явным true или false, а не подпунктом.


Я думаю, некоторым людям неудобно назначать что-либо другое, что true или false переменной типа boolean. Не знаю почему, но я наблюдал это несколько раз.

Итак, с этой точки зрения это выглядит так:

установить сарказм на

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 делает короткую работу всех этих антишаблоны.


на

if (somebool) return true;
else return false;

"шаблон" смеется почти везде, где я когда-либо работал. На мой взгляд, нет причин делать это.


применение тернарного оператора ?: для выражения, которое может оценивать только 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).


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


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

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