Плохо ли объединять вычислитель в троичное выражение?(С#)

StackOverflow https://stackoverflow.com/questions/994724

Вопрос

Я немного осмотрелся и не нашел эквивалентного вопроса.
Это плохая практика кодирования?Я могу легко его прочитать, но не слишком ли это загадочно для тех, кто читает код?

bool? testBool = null;  
string result;  
result = (testBool ?? false ? "Yes" : "No");  

Редактировать: Мои извинения всем за ужасный код!Вот рабочий пример..
Я немного ошеломлен скоростью ответов.Я собирался удалить это и сделать все правильно, но уже было 4 ответа!

Это было полезно?

Решение

Я бы добавил скобки, чтобы уточнить, что происходит, т.е.

bool? testbool = null;
string result;
result = (testbool ?? false) ? "Yes" : "No";

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

Другие советы

Это немного загадочно, даже не очевидно, оценивается ли выражение как:

string result = (testbool ?? false) ? "Yes" : "No";

или:

string result = testbool ?? (false ? "Yes" : "No");

Вы можете использовать GetValueOrDefault метод нулевого типа вместо метода ?? оператор, чтобы сделать его более читабельным:

bool? testbool = null;
string result = (testbool.GetValueOrDefault(false) ? "Yes" : "No");

РЕДАКТИРОВАТЬ:В исходном вопросе использовалось int?.Теперь это исправлено.

Этот код даже не скомпилируется, так что да, я бы сказал, что он слишком загадочный.

Помимо опечаток, тот факт, что вы разместили это без труда пятнистость что возникла проблема (вы пытаетесь использовать bool на правой стороне ??, когда левая часть является int?) предполагает, что это не очень хорошая идея, даже если вы все сделаете правильно.

Мне нужно увидеть реальный пример, но я думаю, что обычно разделите это на один оператор, используя оператор объединения нулей, а затем другой, используя условный оператор.Другой вариант заключается в использовании поведения типов, допускающих значение NULL, по отношению к операторам...но опять же, это разумно затемнять.(Мне просто пришлось напомнить себе, что это за поведение!)

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

РЕДАКТИРОВАТЬ:Одна альтернатива в этот В конкретном случае нужно просто сравнить с "истиной" - что выглядит избыточным, но не в случае bool?:

result = (testBool == true) ? "Yes" : "No";

Скобки, конечно, не обязательны, но, по моему мнению, добавляют ясности.

Я думаю, что это проще:результат будет только «Да», если testBool на самом деле это правда;в противном случае это «Нет».Если вы хотите «по умолчанию» выбрать «Да», вы должны написать:

result = (testBool == false) ? "No" : "Yes";

Оберните его, и я думаю, что все в порядке.

string result = (testbool ?? false) ? "Yes" : "No";

В противном случае предполагаемый порядок операций, даже если он работает, не очевиден.

(Редактировать:Джонатан опередил меня с небольшим преимуществом.)

Разве это не должно быть

bool? testbool = null;

?

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

bool testbool = false;
string result;
result = testbool ? "Yes" : "No";

Я не знаю, был ли ваш пример неполным, но я думаю, что инициализировать переменную значением по умолчанию разумнее, чем использовать значение NULL, а затем ??оператор для установки значения после объявления.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top