我试图对我的对象执行操作,但只有在某些事情属实时才这样做。我有几种方法可以考虑"动作"方法,他们做某些尝试修改对象的操作,如果可以执行该操作,则返回true / false。
示例1
if(number>0 && number<=10)
//number is valid
我知道复合布尔表达式喜欢检查有效值范围内的数字
if ( thing.changeSomething() && (thing.shouldDoSomething() ){
//do more things
}
但是,当子表达式是方法调用
时,避风港真的做得很多示例2
shouldDoSomething()
示例2 与示例1 相同?
示例2 会调用shouldDoSomething()
方法吗?因为我不希望这种情况发生,因为有时try
{
if (e.ProgressPercentage % 30 == 0 || e.ProgressPercentage == 100)
{
if (e.ProgressPercentage < 100)
{
RunOnUiThread(new Action(() =>
{
mBuilder.SetProgress(100, e.ProgressPercentage, false);
mBuilder.SetContentText("Downloading - " + e.ProgressPercentage.ToString() + "%");
mNotifyManager.Notify(notid, mBuilder.Build());
}));
}
else
{
RunOnUiThread(new Action(() =>
{
mBuilder.SetProgress(100, e.ProgressPercentage, false);
mBuilder.SetContentText("Preparing the file");
mNotifyManager.Notify(notid, mBuilder.Build());
}));
}
}
}
catch {};
实际上还有其他影响。改变了对象的其他方面。
答案 0 :(得分:1)
致电
if (thing.changeSomething()){
if (thing.shouldDoSomething()){
基本等同于
if (thing.changeSomething() && thing.shouldDoSomething()){
我猜他们被翻译成完全相同的IL。
然而,如评论中所述,第二种方法仅在第一种方法评估为真时执行。如果&&
- 运算符的第一个操作数已经false
,则无需执行第二个操作数,因此如果shouldDoSomething
,则不执行changeSomething
- 方法allready返回false
。
顺便说一下。这适用于Java和C#。
答案 1 :(得分:0)
简单的答案及其归结为,取决于thing.changeSomething()方法是否返回布尔值。如果没有,它会产生问题。很有可能将此方法定义为执行某些操作,并在执行了应该执行的操作后返回true。在这种情况下,第二个例子可行。
如果它没有返回布尔值,你会看到一个错误,或者它可能不符合你的喜好。
它应该调用方法何时在示例2中这样做。我建议因为你不希望这是创建getter()和checker()方法,用于获取对象的信息而不用不得不改变它。这也可以用数据字段完成,取决于类结构。
希望这更容易消化并有所帮助!
答案 2 :(得分:0)
在Java中,逻辑AND运算符&&
是一个短路运算符,这意味着如果表达式的结果只能从左操作数确定,则不会计算右侧。具体来说,如果左侧的计算结果为false,则整个表达式为false,并且不需要对右侧进行求值以确定。
如果是函数调用:
if ( thing.changeSomething() && (thing.shouldDoSomething() ){
//do more things
}
如果thing.changeSomething()
返回false,则不会调用thing.shouldDoSomething()
,因为无论此函数返回什么,表达式的计算结果为false。所以,是的,以上相当于:
if ( thing.changeSomething() ) {
if (thing.shouldDoSomething() ){
//do more things
}
}