【问题标题】:Null Propagation - Second null checking空值传播 - 第二次空值检查
【发布时间】:2017-11-21 07:49:11
【问题描述】:

我想在 theme.VersionStamp 上插入另一个 null 检查。有没有办法可以将它插入到 SequenceEqual 参数中?

if (theme.VersionStamp != null)
{ 
    if (!origTheme?.VersionStamp.SequenceEqual(theme.VersionStamp) ?? false)
    {
        throw new TwConcurrencyException();
    }
}

【问题讨论】:

  • “我想在主题上插入另一个空检查” -- 为什么?当您到达那部分代码时,您已经知道该值不是null。那里的空检查有什么意义?如果有一点,你想要什么样的空检查?你希望结果是什么?解决您的问题,使其包含一个好的minimal reproducible example,清楚地显示您在做什么,解释该代码的作用以及您希望它做什么,以及您不能做什么具体弄清楚。

标签: c# null-propagation-operator


【解决方案1】:

这不是必需的,因为无论如何您都在进行空检查 if (theme.VersionStamp != null){ 然后继续。但是您仍然可以再次检查并传入一个默认参数,例如

if (!origTheme?.VersionStamp.SequenceEqual(theme.VersionStamp ?? new VersionStamp()) ?? false)

另外,我会将您的第一个 null 检查扩展到下面

if (theme != null && theme.VersionStamp != null)
{ 

【讨论】:

  • “主题”总是有值的。不过,theme.versionstamp 可以为空。
  • 如果theme 也可以为空,则第一个检查可以是if (theme?.VersionStamp != null),这将封装两者。
  • 所以,我检查了代码的原作者,结果他只是错过了在某个逻辑被命中时填充对象的版本戳,这就是我获取实例的原因的空版本戳。无论如何,感谢您的帮助,我学到了很多东西。 :)
【解决方案2】:

不幸的是,在传递参数时添加空检查是不可能的。

你能得到的最短的是:

if (theme?.VersionStamp == null || 
    !origTheme?.VersionStamp?.SequenceEqual(theme.VersionStamp) ?? false)
{
    throw new TwConcurrencyException();
}

我不会像 Rahul 那样传递默认参数,因为如果 origThemeVersionStamp 等于默认 VersionStamp SequenceEqual 将错误地返回 true

【讨论】:

  • 使用 C# 7 和 Throw Expressions 现在可以做到这一点:.SequenceEqual(theme.VersionStamp ?? throw new ArgumentException(...)) 但是,在 this 的情况下,由于之前的 if 语句,这是不必要的。
猜你喜欢
  • 2017-11-15
  • 2017-04-20
  • 1970-01-01
  • 2022-12-10
  • 2013-05-16
  • 2014-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多