"Если" условие лучше чем?? и кастинг
У меня есть следующие два подхода для той же функциональности - один с условием "если" и один с "?? и кастинг ". Какой подход лучше? Почему?
Код:
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);
ОБНОВИТЬ
Основываясь на ответах, ниже приведены преимущества ??
- Увеличенная читаемость
- Снижение глубины ветвления программного потока (уменьшение цикломатической сложности)
Примечание. Стоимость применения объекта незначительна.
ССЫЛКА
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
, Тогда вам нужно только изменить его в одном месте.