if调用对象上的方法的语句是否会修改对象?

时间:2017-06-09 14:20:07

标签: java c# if-statement methods conditional

我试图对我的对象执行操作,但只有在某些事情属实时才这样做。我有几种方法可以考虑"动作"方法,他们某些尝试修改对象的操作,如果可以执行该操作,则返回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 {}; 实际上还有其他影响。改变了对象的其他方面。

3 个答案:

答案 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
    }
}