??或 .GetValueOrDefault()
?? or .GetValueOrDefault()
我在计算中使用了 int?
和 decimal?
类型的属性。如果其中任何一个的值为 null,则它必须默认为 0。我正在尝试在使用 null-coalescing 或 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())
+ ...
}
在这种情况下,??
(空合并)将在内部调用 GetValueOrDefault
。
性能差异将是微不足道的(除非您有性能问题),所以剩下的就是找出您认为更具可读性的方式。
看看here。
可读性
这当然是个人意见,但是
- 看了
?? 0
感觉一下子就明白了
- 我读了
GetValueOrDefault
并且不得不花点时间考虑类型,然后考虑该类型的默认值(我不认为这是一个问题,只是指出“心理映射”)
性能
This article holds that GetValueOrDefault
compiles to CIL that's technically faster, but the improvement is a micro-optimization 充其量。
SharpLab, however, has both versions compiling to the exact same CIL (via Marc's ),这将使它们的性能相同。
无论哪种方式,性能差异充其量是微不足道的,最坏的情况下不存在,这意味着应优先考虑可读性。
我在计算中使用了 int?
和 decimal?
类型的属性。如果其中任何一个的值为 null,则它必须默认为 0。我正在尝试在使用 null-coalescing 或 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())
+ ...
}
??
(空合并)将在内部调用 GetValueOrDefault
。
性能差异将是微不足道的(除非您有性能问题),所以剩下的就是找出您认为更具可读性的方式。
看看here。
可读性
这当然是个人意见,但是
- 看了
?? 0
感觉一下子就明白了 - 我读了
GetValueOrDefault
并且不得不花点时间考虑类型,然后考虑该类型的默认值(我不认为这是一个问题,只是指出“心理映射”)
性能
This article holds that GetValueOrDefault
compiles to CIL that's technically faster, but the improvement is a micro-optimization 充其量。
SharpLab, however, has both versions compiling to the exact same CIL (via Marc's
无论哪种方式,性能差异充其量是微不足道的,最坏的情况下不存在,这意味着应优先考虑可读性。