【问题标题】:Programming logic IF Then编程逻辑 IF Then
【发布时间】:2012-11-21 17:27:08
【问题描述】:

我一直在处理这类问题,想知道您是否有任何巧妙优雅的解决方法:

if(myObject != null && myObject.myProperty != myValue){
//do something
}else{
//do something else
}

如果我运行这个逻辑,我会在 myObject 为空时得到空引用,所以我最终会这样做:

if(myObject != null){
    if(myObject.myProperty != myValue){
        //do something
    }else{
        //do something else
    }
}else{
    //do something else
}

所以我最终在我的“做其他事情”上有多余的代码,你们如何处理这个?

【问题讨论】:

  • 您确定第一个代码中有两个& 符号吗?如果你只有一个,你会期望一个空引用。两个应该防止这种情况发生。
  • 这里的`do something else's 到底有什么不同?
  • 你的第一个代码段是有效的
  • 你确定吗?如果myObject 为空,它将使您的 if 语句短路并完全按预期工作。
  • 如果myObjectnull 它不会评估第二个条件,如果它不是null 它不应该抛出NullReferenceException。你的第一个代码很好!

标签: c# if-statement logic


【解决方案1】:

null 的第一次检查意味着如果不满足第二个条件将不会被评估 - 当使用逻辑 AND (&&) - 所以我建议你的空引用异常来自其他地方,而不是那个后一种情况。

【讨论】:

  • 很好的解释,我会选择这个作为答案
【解决方案2】:

没有“优雅”的方式来处理这个问题 - 共享“做其他事情”的代码的两种方式实际上在不同程度上不优雅:

  • 您可以将“做其他事情”代码放入函数中,或者
  • 在输入 if 之前定义一个标志以说明是否需要额外处理,并在退出 if 语句时对该标志采取行动。

第一个解决方案是不言自明的;第二种解决方案如下所示:

var processed = false;
if(myObject != null) {
    if(myObject.myProperty != myValue){
        //do something
        processed = true;
    }
    // do more stuff knowing that myObject is not null
}
if (!processed) {
    // do something else
}

【讨论】:

  • ++ 我以前不得不使用这个结构,我很高兴得到确认,没有什么办法绕过它。
  • 但据我所知,OP 实际上并没有说“问题”。
【解决方案3】:

您的第一个陈述是完全有效的。

if(myObject != null && myObject.MyProperty != myValue)

这将首先评估myObject != null,并且由于它的右侧有一个&&,如果它是假的,它甚至不需要评估另一个子句。

如果你只是复制粘贴这里粘贴的代码,我想你会发现它运行成功了

【讨论】:

  • 这也有语法错误。 if!- 的大小写错误没有意义。
猜你喜欢
  • 1970-01-01
  • 2018-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-21
  • 1970-01-01
  • 2022-12-17
  • 1970-01-01
相关资源
最近更新 更多