【问题标题】:How logical AND (&&) works in c#? [closed]c# 中的逻辑 AND (&&) 是如何工作的? [关闭]
【发布时间】:2016-05-19 07:36:17
【问题描述】:

我遇到了一个场景来检查外部和内部对象的空引用。外部对象有可能为空,内部对象也有可能。

 if (outerObject != null && outerObject.innerObject != null)
 {
    outerObject.innerObject.DoSomething();
 }

如果 if 中的第二个表达式求值,则将抛出 NullRefence Exception

如果喜欢,我可以选择使用嵌套

if(outerObject != null)
{
    if(outerObject.innerObject != null)
    {
        outerObject.innerObject.DoSomething();
    }
}

我只是想知道,即使第一个表达式为假,是否会计算第二个表达式?

哪个是最好的?

【问题讨论】:

  • 鱼或禽,第一个 sn-p 的代码生成与第二个 sn-p 完全相同。叫short-circuit evaluation。广大程序员偏爱 1st sn-p,由您与团队成员讨论或自行选择。
  • CSharp 使用short circuit evaluation,因此仅在必要时进行第二次比较。
  • 它是如此基础,我相信任何一本书都提到过它(你读过一本吗?)。此外,它很容易测试,编写几个返回 bool 的方法并使用它们(返回 falsetrue)同时使用像 if(Method1() && Method2() && (Method3() || Method4())) ... 这样的条件
  • 这与 && 运算符无关。这是关于 IF 语句的工作原理。垃圾邮件。
  • @ZverevEugene 我认为这是关于 &&,而不是 IF 的工作原理。如果代码是var compRes = outerObject != null && outerObject.innerObject != null 怎么办?它会抛出异常吗?不,所以这绝对是关于 && 运算符

标签: c# performance logical-operators


【解决方案1】:

&& 运算符通过检查第一个运算符/表达式来工作 - 如果计算结果为真,则仅考虑第二个。

所以,你的第一个选择就足够了:

if (outerObject != null && outerObject.innerObject != null)
 {
    outerObject.innerObject.DoSomething();
 }

【讨论】:

  • 请注意,在大多数书籍中,这种类型的评估称为“短路”评估。
【解决方案2】:

C# 6.0 现在支持?. Null 条件运算符。这意味着您可以转换:

if (outerObject != null && outerObject.innerObject != null)

if (outerObject?.innerObject != null)

此外,&& 在 C# 中使用短路求值,它首先检查左/第一个表达式,然后(如果为真)检查右表达式。

【讨论】:

  • 不是Lazy 是短路!
  • @CallumLinington 已编辑
  • 如果您希望引入 Null 条件运算符,请执行到最后。代码应如下所示:outerObject?.innerObject?.DoSomething();不需要if 声明。
【解决方案3】:

在这种情况下,两者是相等的。有趣的是,编译器可能会将第二个代码转换为第一个样式 if 语句。你也可以这样做:

outerObject?.innerObject?.DoSomething();

【讨论】:

  • 代码应该是C# 5.0
【解决方案4】:

条件与运算符 (&&) 对其布尔值执行逻辑与 操作数,但仅在必要时评估其第二个操作数。阅读here

如果第一个表达式为假,它永远不会检查第二个!

所以你的第一个选择是好的:

if (outerObject != null && outerObject.innerObject != null)
 {
    outerObject.innerObject.DoSomething();
 }

这也称为short-circuit评估

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 2011-01-20
    • 2011-05-25
    • 2023-03-12
    • 1970-01-01
    相关资源
    最近更新 更多