Состояние "Если" лучше, чем??? и литье

У меня есть два подхода для одинаковой функциональности: один с условием "if" и один с "?? и литьем". Какой подход лучше? Почему?

код:

  Int16? reportID2 = null;
  //Other code

  //Approach 1
  if (reportID2 == null)
  {
       command.Parameters.AddWithValue("@report_type_code", DBNull.Value);
  }
  else
  {
     command.Parameters.AddWithValue("@report_type_code", reportID2);
  }

  //Approach 2
  command.Parameters.AddWithValue("@report_type_code", ((object) reportID2) ?? DBNull.Value);

UPDATE

На основе ответов следуют преимущества ??

  • Повышенная читаемость
  • Уменьшение разветвленности потока программы (уменьшенная циклическая сложность)

Примечание. Стоимость литья в качестве объекта незначительна.

ССЫЛКА

Ответ 1

Я всегда использую оператор нуль-коалесценции в таких случаях:

command.Parameters.AddWithValue("@name", value ?? DBNull.Value);

command.ExecuteScalar() as int? ?? -1;

и др.

Это повышает читаемость кода, уменьшает глубину разветвления. Также был создан специально для сценариев, связанных с базой данных, таких как ADO.NET.

Ответ 2

Оператор нулевого коалесцирования (??) является лучшим подходом, поскольку он выполняет то же самое, что и ваш начальный блок, но в одной, легко читаемой строке. Это делает код более читабельным и более удобным.

Это один из многих примеров синтаксического сахара, то есть операторов кода, которые являются "ярлыками" для представления общепринятой идеи. i++ - еще один пример этого, поскольку он заменяет i = i + 1. Он чище и проще, так же, как ??.

Ответ 3

В вашем примере подход 2 лучше. Вы не должны повторять себя, а у оценщика 1 есть код и имя параметра дважды. Если вы хотите изменить имя paramater, вы должны сделать это на двух местах, и это затруднительно.

Настоящий код для сравнения этого:

object value = DBNull.Value;
if (reportID2 != null)
{
    value = reportID2;
}
command.Parameters.AddWithValue("@report_type_code", value);

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

Ответ 4

Я бы предпочел оператор ??. Хотя краткость не всегда приводит к лучшей читаемости, в этом случае это происходит потому, что в качестве читателя вам не нужно сравнивать то, что равно, и что отличается между двумя строками if и else. Кроме того, вы устранили дублирование кода (что всегда хорошо!). Рассмотрим случай, когда вы переименовываете имя поля вашей базы данных @report_type_code. Тогда вам нужно только изменить его в одном месте.