我有以下的相同的功能两种方式 - 一个用“如果”条件和一个用“? 和铸造”。哪种方法更好?为什么?
码:
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
根据答案,以下是好处??
- 增加可读性
- 降低支化deapth程序流(减少圈复杂度)的
注:铸件的成本为研究对象是可以忽略不计。
参考
- 空Coallescing运营商-为什么铸造?
我总是用空合并运算在这种情况下:
command.Parameters.AddWithValue("@name", value ?? DBNull.Value);
command.ExecuteScalar() as int? ?? -1;
等等
它提高了代码的可读性,减少分支深度。 也是为与数据库相关的方案,如ADO.NET特别创建的。
空合并运算符( ??
)是一个更好的方法,因为它做同样的事情作为你的初始块,但在一个单一的,易于读取线。 这使得代码更易读和更易于维护。
这是语法糖许多例子之一,也就是代码语句这是“捷径”为代表的常用概念。 i++
是的这个另一实例中,因为它代替i = i + 1
。 这是更清洁和更简单,只是想??
。
在你的榜样,方法2时更好。 你不应该重复自己 ,并apprach 1具有代码和参数名的两倍。 如果你想改变paramater名字,你应该这样做,在两个地方,这是一个麻烦。
真正的代码比较这对是这样的:
object value = DBNull.Value;
if (reportID2 != null)
{
value = reportID2;
}
command.Parameters.AddWithValue("@report_type_code", value);
如果你使用这个或??
运营商是个人喜好的问题。 我认为if
是比较明确的,尤其是因为你需要括号和聚结操作的情况下铸造。
我更喜欢的??
运营商。 虽然简洁并不总是带来更好的可读性,在这种情况下,它确实是因为作为读者你没有比较的是平等的,什么是两行之间的不同if
和else
。 此外,还消除了重复的代码(这是一件好事!)。 考虑您重新命名数据库字段名的情况下@report_type_code
。 然后,你只需要在一个地方改变它。