"Если" условие лучше чем?? и кастинг

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

Код:

  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);

ОБНОВИТЬ

Основываясь на ответах, ниже приведены преимущества ??

  1. Увеличенная читаемость
  2. Снижение глубины ветвления программного потока (уменьшение цикломатической сложности)

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

ССЫЛКА

  1. Оператор нуль-коалесценции - зачем кастинг?

4 ответа

Решение

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

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

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

и т.п.

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

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

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

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

Реальный код для сравнения это:

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

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

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

Другие вопросы по тегам