【问题标题】:C# 6.0 null operator in a conditional statement条件语句中的 C# 6.0 空运算符
【发布时间】:2015-08-25 15:15:00
【问题描述】:

根据我在 C# 6.0 中使用新的 null 运算符收集到的信息,您可以执行以下操作:

string name = people.FirstOrDefault()?.FullName;

这很好,但我经常遇到的一个验证是这样的:

object name = null;
if(name != null) {
    DoSomething();
} else {
    DoSomethingElse();
}

鉴于新的null 运算符的目的,我希望这样的事情应该是可能的:

if(name?) {
    DoSomething();
} else {
    DoSomethingElse();
}

据我了解,这里的问题是,当? 检查的值实际上是null 时,它返回null,而if 语句需要bool 条件。由于您不能直接将null 转换为bool,有没有更简单的方法可以在不使用 C# 6.0 中新的null 运算符的情况下检查此问题而不使用if(name != null)

【问题讨论】:

  • 认真的吗?输入!= null 还不够简单?很清晰,可读性强,六个月看代码的开发者很容易明白它在做什么……
  • 这样一个运营商的目的是什么?写if(name?) ...而不是if(name!=null) 有什么好处
  • 在 JS 中,您可以简单地执行 if(name) 并验证 null,在我看来,接近的东西会是一件好事,而且它可能在新的更新中,猜不出来。
  • @ricochte 在 Javascript 中没有什么简单 - 事实上,对空值的不一致处理是该语言更成问题的特性之一。 为什么 null 值应该被视为布尔值 False?缺失值在逻辑上与 False 值不同。
  • 虽然这不是您要求的,但请记住,有时??? 一起可以为您提供简洁的表达方式。例如:var bar = foo?.wombat ?? defaultWombat;

标签: c# null c#-6.0


【解决方案1】:

这样做没有意义。在您的示例中,您没有进行任何空值合并 - 您只是在检查空值。

如果您想检查name 对象的某个成员,则更好用。例如:

if (name?.FirstName != null) ...

但正如您所见,它仍然是对 null 的简单比较 - 我们只是使用 null 合并来避免编写类似这样的内容:

if (name != null && name.FirstName != null) ...

【讨论】:

  • 我同意这不是更好地使用此功能,但是我想要更简单的东西,就像 JS 中的 if(name) 一样,它会自动验证 null .感谢您的回答。
  • 我喜欢这样做:if (Session?.Connected) { } 但不幸的是,这不受支持,您必须执行类似的操作:if (Session?.Connected == true) {}
  • @juFo 这很明显,如果你想一想 - 因为你使用合并运算符,bool 变成了bool?null 必须传播到所有空值合并)。而if (default(bool?)) 与允许if (null) 完全一样有意义——也就是说,不是很多。你可以做的是使用(session?.Connected).GetValueOrDefault(false) - 这比a == true更明确。
  • @Luaan 或更简洁的if (session?.Connected ?? false) - 这仍然没有比 juFo 所做的更短或更清晰。当需要更多替代品时开始变得更有用:if(session?.Connected ?? RestartSession()?.Connected ?? false)
猜你喜欢
  • 1970-01-01
  • 2020-08-19
  • 1970-01-01
  • 2011-02-18
  • 2023-04-05
  • 2013-02-16
  • 1970-01-01
  • 2019-03-27
  • 2016-12-17
相关资源
最近更新 更多