??或 .GetValueOrDefault() [关闭]

Posted

技术标签:

【中文标题】??或 .GetValueOrDefault() [关闭]【英文标题】:?? or .GetValueOrDefault() [closed] 【发布时间】:2019-10-19 14:10:15 【问题描述】:

我有用于计算的属性类型 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())
          + ...
    

【问题讨论】:

定义什么对你来说是“更好的”。我会用??出于混乱的原因,有些人可能更喜欢 GVOD 的快速可读性 “更好”是代码外观/可读性和性能(如果有任何明显差异) 第一个似乎更容易阅读恕我直言。 恐怕这个问题在很大程度上与 SO 无关,因为它“主要基于意见”本质上是“其中哪个看起来更好?” @CaiusJard 你是对的,我个人认为顶部的更好看:-) 【参考方案1】:

可读性

这当然是意见,但是

看了?? 0,感觉一下子就明白了 我读了GetValueOrDefault,不得不花点时间考虑一下类型和该类型的默认值(我不认为这是一个问题,只是指出“心理映射”)

性能

This article 认为 GetValueOrDefault 编译为 CIL,这在技术上更快,但改进最多是 micro-optimization。

但是,SharpLab 的两个版本都编译为完全相同的 CIL(通过 Marc's comment below),这将使它们的性能相同。

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

【讨论】:

没有性能差异 - 见:sharplab.io/…【参考方案2】:

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

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

查看here。

【讨论】:

我有兴趣了解更多关于编译器如何知道将其重写为 GVOD 的信息?我一直认为它被重写为 inline-if null 检查 @CaiusJard 请注意,这与 Null Coalesce 的关系不大,而与 Null 类型的关系更大,因为它们在各种方面都是语言中的一种特殊情况,它们也是一个实现细节。跨度> 也许是一个更好的例子:sharplab.io/…

以上是关于??或 .GetValueOrDefault() [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

linq to entity常用操作

选取器不显示先前的选择

默认(类型)的编程等效项

x?.y?.z 是啥意思?

Lambda 表达式中的 SQL WHERE 等价物是啥?

PHP MySql MsSql 如何插入或更新 ['] 或 ["] 或 [`] 字符?