链式IF结构

时间:2008-12-17 14:51:41

标签: c# java

想象一下这种情况,我有一个需要检查属性的对象。 但是,该对象当前可以具有空值。

如何在单个“if”条件下检查这两个条件?

目前,我必须做这样的事情:

if (myObject != null)
{
    if (myObject.Id != pId)
    {
        myObject.Id = pId;
        myObject.Order = pOrder;
    }
}

我想要这样的事情:

if (myObject != null && myObject.Id != pId)

我想仅在第一个条件成立时评估第二个条件。

也许我错过了什么,这就是我需要你帮助的原因; - )

10 个答案:

答案 0 :(得分:43)

if(myObject != null && myObject.Id != pId)
{
   myObject.Id = pId;
   myObject.Order = pOrder;
}

&&是一个短路逻辑测试 - 如果左侧是真的,它只评估右侧。与“a& b”形成对比,它总是评估双方(并且按位“和”)

答案 1 :(得分:10)

应该强调的是&& amp;的短路评估。在if()中,语言标准(C,C ++,Java和C#)绝对保证。自第一版K& R的“ C编程语言”以来,就是这样。

这不是你必须担心的事情“我的编译器是否实现了这个?”。如果肯定是

答案 2 :(得分:5)

if (myObject != null && myObject.Id != pId)
{
//bla
}

这是安全的,因为运营商&&被懒惰地评估,这意味着如果LHS是假的,则永远不会评估RHS

答案 3 :(得分:4)

此代码首先检查myObject是否为null,如果为true则将检查下一个条件,如果不是,则不检查下一个条件而不执行代码。

if (myObject != null && myObject.Id != pId)
{
  myObject.Id = pId;
  myObject.Order = pOrder;
}

答案 4 :(得分:3)

你有很多关于如何做的好答案。我只是想对如何不这样做发出警告。 不要在try-catch块中包装id = pid的单个测试。这很浪费,并且会引入异常检查以捕获非异常情况。这是一个糟糕的主意,我甚至不会用一个例子来说明它。

答案 5 :(得分:1)

if (myObject != null && myObject.Id != pId)
{
     myObject.Id = pId;
     myObject.Order = pOrder;
}

答案 6 :(得分:1)

if(!(myObject == null || myObject.Id == pId))
{
   myObject.Id = pId;
   myObject.Order = pOrder;
}

答案 7 :(得分:1)

我认为在VB.net中您可以使用andAlso关键字作为此行为的替代方法。所以......就像......

if(myObject != null andAlso myObject.Id != pId)
  {
   myObject.Id = pId;
   myObject.Order = pOrder;
  }

if(myObject != null andAlso myObject.Id != pId) { myObject.Id = pId; myObject.Order = pOrder; }

我认为是完全相同的事情,但它作为另一种选择!

编辑:将C#更改为上面的VB.net

答案 8 :(得分:1)

因为我认为将来看这个问题的其他人可能会有所帮助。如上所述,使用&&提供您想要的功能。但是,还应该注意,你担心的功能,无论第一次评估的结果如何,双方都将被评估,可以通过使用&而不是&&amp ;.所以:

//DO NOT USE THIS CODE
//this will throw an exception if myObject is null
//because myOject.Id != pId will still be evaluated
if(myObject != null & myObject.Id != pId)
{   
   myObject.Id = pId;
   myObject.Order = pOrder;
}

同样,对于此示例,您不需要此代码。我只是想将它添加到对话中,因为可能存在(虽然我从未找到过)这种情况,例如:

//always run both methods
if(MethodA() & MethodB())
{   
   //do stuff only when both methods return true
}

答案 9 :(得分:1)

你可以使用&评估两个条件,但如果你只想在第一个元素为真时测试第二个条件,你可以使用&&。

在葡萄牙语中我们称之为:“AND com curto circuito”。

if (myObject != null && myObject.Id != pId)

如果myObject为false,则无法测试myObject.Id,因为myObject为null,您无法访问null对象的属性。

:::::::::::::::::::::::

a b a&& B'/ P>

true true true

true false false

false true false

false false false

:::::::::::::::::::::::