“如果”条件好于??和铸造

时间:2012-12-04 08:01:05

标签: c# performance casting null-coalescing-operator

我有两种相同功能的方法 - 一种是“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. 减少程序流程的分支深度(降低了圈复杂度)
  3. 注意:作为对象的投射成本可以忽略不计。

    参考

    1. Null-Coallescing Operator - Why Casting?

4 个答案:

答案 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)

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