3

我有属性类型int?decimal?并且正在计算中使用。如果其中任何一个的值为 null,则它必须默认为 0。我正在尝试在使用 null-coalescing 或GetValueOrDefault()如果值为null. 哪种方法在可读性和性能方面会更好(如果有任何明显的差异)?

第一的:

public decimal MyMethod(int memberId)
{ 
    var dto = GetDtoValue(memberId);
 return (dto.PropertyOne ?? 0)
      + (dto.PropertyTwo ?? 0)
      + (dto.PropertyThree ?? 0)
      - (dto.PropertyFour ?? 0)
      + ...
}

第二:

public decimal MyMethod(int memberId)
    { 
        var dto = GetDtoValue(memberId);
     return dto.PropertyOne.GetValueOrDefault())
          + dto.PropertyTwo.GetValueOrDefault())
          + dto.PropertyThree.GetValueOrDefault())
          - dto.PropertyFour.GetValueOrDefault())
          + ...
    }
4

2 回答 2

4

可读性

这当然是意见,但是

  • 我读?? 0了,感觉马上就清楚了
  • 我阅读GetValueOrDefault并不得不花点时间考虑类型,然后考虑该类型的默认值(我不认为这是一个问题,只是指出“心理映射”)

表现

本文认为GetValueOrDefault编译成 CIL 在技术上更快,但改进充其量只是微优化。

然而, SharpLab的两个版本都编译为完全相同的 CIL(通过Marc 在 下面的评论),这将使它们的性能相同。

无论哪种方式,性能差异充其量是微不足道的,最坏的情况是不存在的,这意味着应该优先考虑可读性

于 2019-06-04T04:31:08.760 回答
2

??(null coalesce)GetValueOrDefault在这种情况下会在内部调用。

性能差异将是微不足道的(除非您遇到性能问题),所以剩下的就是找出您认为哪种方式更具可读性。

在这里查看。

于 2019-06-04T04:23:04.060 回答