10

对于相同的功能,我有以下两种方法 - 一种带有“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);

更新

根据答案,以下是 ??

  1. 提高可读性
  2. 减少程序流的分支深度(降低圈复杂度)

注意:作为对象的铸造成本可以忽略不计。

参考

  1. 空合并运算符 - 为什么要强制转换?
4

4 回答 4

10

空合并运算符 ( ??) 是一种更好的方法,因为它与您的初始块执行相同的操作,但在一个易于阅读的行中。这使代码更具可读性和可维护性。

这是语法糖的众多示例之一,也就是说,代码语句是表示常用思想的“快捷方式”。i++是另一个例子,因为它取代了i = i + 1. 它更干净、更简单,就像??.

于 2012-12-04T08:04:41.107 回答
4

在这种情况下,我总是使用空合并运算符:

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

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

等等

它增加了代码的可读性,减少了分支深度。还专门为与数据库相关的方案(例如 ADO.NET)而创建。

于 2012-12-04T08:02:23.647 回答
2

在您的示例中,方法 2 更好。你不应该重复自己,apprach 1 有两次代码和参数名称。如果要更改参数名称,则应在两个地方进行,这很麻烦。

与之比较的真正代码是这样的:

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

是否使用这个或??运营商是个人喜好的问题。我认为if更清楚,特别是因为在合并运算符的情况下需要括号和强制转换。

于 2012-12-04T08:06:35.790 回答
0

我更喜欢??运营商。尽管简洁并不总能带来更好的可读性,但在这种情况下确实如此,因为作为读者,您不必比较 and 的两行之间的相同和不同之ifelse。此外,您消除了重复代码(这总是好的!)。考虑重命名数据库字段名称的情况@report_type_code。然后你只需要在一个地方改变它。

于 2012-12-04T08:09:11.797 回答