我有属性类型int?
和decimal?
正在计算中使用。如果其中任何一个的值为 null,则必须默认为 0。我正在尝试决定是使用 null 合并还是 GetValueOrDefault()
如果值为 null
,它也默认为 0。哪种方法在可读性和性能方面更好(如果有任何明显的差异(?
第一:
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())
+ ...
}
读性
这当然是意见,但是
- 我读了
?? 0
,感觉马上就清楚了 - 我读了
GetValueOrDefault
,必须花一秒钟来考虑类型,然后考虑该类型的默认值(我不认为这是一个问题,只是指出"心理映射"(
性能
本文认为,GetValueOrDefault
编译为 CIL 在技术上更快,但改进充其量只是微优化。
然而,SharpLab的两个版本都编译为完全相同的CIL(通过Marc下面的评论(,这将使它们的性能相同。
无论哪种方式,性能差异充其量是微不足道的,最坏的情况是不存在的,这意味着应优先考虑可读性。
??
(null mergeesce(将在内部调用GetValueOrDefault
。
差异将是微不足道的(除非您遇到性能问题(,因此剩下的就是找出您认为哪种方式更具可读性。
在这里查看。