Разве плохо объединять оценщик в троичном выражении? (С #) - PullRequest
0 голосов
/ 15 июня 2009

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

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

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

Ответы [ 5 ]

10 голосов
/ 15 июня 2009

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

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

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

2 голосов
/ 15 июня 2009

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

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

или

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

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

bool? testbool = null;
string result = (testbool.GetValueOrDefault(false) ? "Yes" : "No");
2 голосов
/ 15 июня 2009

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

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

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

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

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

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

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

Скобки не нужны, конечно, но добавьте ясности IMO.

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

result = (testBool == false) ? "No" : "Yes";
1 голос
/ 15 июня 2009

Оберните это, и я думаю, что это хорошо.

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

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

(Правка: Джонатан бил меня по щепотке.)

0 голосов
/ 15 июня 2009

Не должно ли быть

bool? testbool = null;

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

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

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

...