我有两种相同功能的方法 - 一种是“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);
更新
根据答案,以下是??
注意:作为对象的投射成本可以忽略不计。
参考
答案 0 :(得分:10)
空合并运算符(??
)是一种更好的方法,因为它与初始块的作用相同,但是在一条易读的行中。 这使代码更具可读性和可维护性。
这是语法糖的许多例子之一,也就是说代码语句是表示常用想法的“快捷方式”。i++
是另一个例子,因为它取代了{{1} }。它更清晰,更简单,就像i = i + 1
。
答案 1 :(得分:4)
在这种情况下,我总是使用null-coalescing operator:
command.Parameters.AddWithValue("@name", value ?? DBNull.Value);
command.ExecuteScalar() as int? ?? -1;
等
它增加了代码可读性,减少了分支深度。也是专门为数据库相关的场景创建的,例如ADO.NET。
答案 2 :(得分:2)
在您的示例中,方法2更好。您should not repeat yourself和apprach 1的代码和参数名称都是两次。如果你想改变参数名称,你应该在两个地方这样做,这很麻烦。
比较这个的真实代码是:
object value = DBNull.Value;
if (reportID2 != null)
{
value = reportID2;
}
command.Parameters.AddWithValue("@report_type_code", value);
如果您使用此选项,或??
运算符是个人偏好的问题。我认为if
更清楚,特别是因为在coalesce运算符的情况下你需要括号和转换。
答案 3 :(得分:0)
我更喜欢??
运算符。尽管简洁并不总能带来更好的可读性,但在这种情况下确实如此,因为作为读者,您不必比较if
和else
两行之间的相同和不同之处。 。此外,您消除了代码重复(这总是很好!)。考虑重命名数据库字段名@report_type_code
的情况。然后你只需要在一个地方改变它。