"如果"条件好于?? 和铸造

LCJ*_*LCJ 10 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);
Run Code Online (Sandbox Code Playgroud)

UPDATE

根据答案,以下是的好处 ??

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

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

参考

  1. Null-Coallescing运算符 - 为什么选择铸造?

Lev*_*lho 10

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

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

  • @FelixK.:对于小于4的switch-case,它只是if-else(由编译器解包) (5认同)
  • @FelixK.IMO只是一个实现细节.允许编译器将多个`if`s转换为跳转表,并切换成多个`if`s. (3认同)

aba*_*hev 4

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

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

command.ExecuteScalar() as int? ?? -1;
Run Code Online (Sandbox Code Playgroud)

ETC。

它增加了代码的可读性,减少了分支深度。也是专门为数据库相关场景(例如 ADO.NET)创建的。

  • 我也不确定转换为对象会花费什么。 (2认同)
  • @Lijo 1)由于“AddWithValue”采用“object”,它总是会导致装箱,因此您的方法不会保存任何内容。无论哪种方式,每个参数都可以进行一次装箱操作。转换为对象并不是免费的,因为稍后需要收集该对象,但它也不是太昂贵。2)与数据库查询的成本相比,一些框可以忽略不计。 (2认同)