Состояние "Если" лучше, чем??? и литье
У меня есть два подхода для одинаковой функциональности: один с условием "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
. Тогда вам нужно только изменить его в одном месте.