想象一下这种情况,我有一个需要检查属性的对象。 但是,该对象当前可以具有空值。
如何在单个“if”条件下检查这两个条件?
目前,我必须做这样的事情:
if (myObject != null)
{
if (myObject.Id != pId)
{
myObject.Id = pId;
myObject.Order = pOrder;
}
}
我想要这样的事情:
if (myObject != null && myObject.Id != pId)
我想仅在第一个条件成立时评估第二个条件。
也许我错过了什么,这就是我需要你帮助的原因; - )
答案 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
:::::::::::::::::::::::