调用对象方法的 if 语句会修改对象吗?
Do if statements that call methods on an object modify the object?
我正在尝试对我的对象执行操作,但只有在某些事情为真时才这样做。我有几种考虑 "action" 方法的方法,它们 执行 一些尝试修改对象的操作,并且 returns true/false 如果该操作可以完成。
示例 1
Thing thing = new Thing();
if (thing.changeSomething()){
if (thing.shouldDoSomething()){
//do more things
}
}
我知道复合布尔表达式喜欢检查数字是否在有效值范围内
if(number>0 && number<=10)
//number is valid
但是当子表达式是方法调用时,并没有真正做太多事情
示例 2
if ( thing.changeSomething() && (thing.shouldDoSomething() ){
//do more things
}
示例 2 是否与 示例 1 相同?
示例 2 会调用 shouldDoSomething()
方法吗?因为我不希望发生这种情况,因为有时 shouldDoSomething()
实际上会产生其他影响并改变对象的其他方面。
通话中
if (thing.changeSomething()){
if (thing.shouldDoSomething()){
本质上等同于
if (thing.changeSomething() && thing.shouldDoSomething()){
我猜他们被翻译成完全相同的 IL。
然而,正如评论中提到的,第二种方法仅在第一种方法的计算结果为真时执行。如果 &&
-operator 的第一个操作数已经是 false
则没有必要再执行第二个操作数,所以如果 changeSomething
你的 shouldDoSomething
-method 不会被执行已经返回 false
.
顺便说一句。这适用于 Java 和 C#。
简单的答案及其归结为,它取决于 thing.changeSomething() 方法 return 是否为布尔值。如果不这样做,就会产生问题。很有可能定义这个方法来做某事,并且在它做了它应该做的事情之后 return true 。在这种情况下,第二个示例将起作用。
如果它不是 return 布尔值,您应该会看到一个错误,或者它可能不符合您的喜好。
它应该在示例 2 中以这种方式调用该方法。我建议您创建 getter() 和 checker() 方法,因为您不希望这样做获取有关对象的信息而无需更改它。这也可以用数据字段来完成,取决于 class 结构。
希望这更容易理解并有所帮助!
在 Java 中,逻辑与运算符 &&
是一个短路运算符,这意味着如果表达式的结果可以单独从左侧操作数确定,则不计算右侧。具体来说,如果左侧的计算结果为假,则整个表达式为假,无需计算右侧即可确定。
在您的函数调用的情况下:
if ( thing.changeSomething() && (thing.shouldDoSomething() ){
//do more things
}
如果 thing.changeSomething()
return 为 false,则 thing.shouldDoSomething()
将不会被调用,因为无论此函数 return 是什么,表达式的计算结果都是 false。所以是的,以上等同于:
if ( thing.changeSomething() ) {
if (thing.shouldDoSomething() ){
//do more things
}
}
我正在尝试对我的对象执行操作,但只有在某些事情为真时才这样做。我有几种考虑 "action" 方法的方法,它们 执行 一些尝试修改对象的操作,并且 returns true/false 如果该操作可以完成。
示例 1
Thing thing = new Thing();
if (thing.changeSomething()){
if (thing.shouldDoSomething()){
//do more things
}
}
我知道复合布尔表达式喜欢检查数字是否在有效值范围内
if(number>0 && number<=10)
//number is valid
但是当子表达式是方法调用时,并没有真正做太多事情
示例 2
if ( thing.changeSomething() && (thing.shouldDoSomething() ){
//do more things
}
示例 2 是否与 示例 1 相同?
示例 2 会调用 shouldDoSomething()
方法吗?因为我不希望发生这种情况,因为有时 shouldDoSomething()
实际上会产生其他影响并改变对象的其他方面。
通话中
if (thing.changeSomething()){
if (thing.shouldDoSomething()){
本质上等同于
if (thing.changeSomething() && thing.shouldDoSomething()){
我猜他们被翻译成完全相同的 IL。
然而,正如评论中提到的,第二种方法仅在第一种方法的计算结果为真时执行。如果 &&
-operator 的第一个操作数已经是 false
则没有必要再执行第二个操作数,所以如果 changeSomething
你的 shouldDoSomething
-method 不会被执行已经返回 false
.
顺便说一句。这适用于 Java 和 C#。
简单的答案及其归结为,它取决于 thing.changeSomething() 方法 return 是否为布尔值。如果不这样做,就会产生问题。很有可能定义这个方法来做某事,并且在它做了它应该做的事情之后 return true 。在这种情况下,第二个示例将起作用。
如果它不是 return 布尔值,您应该会看到一个错误,或者它可能不符合您的喜好。
它应该在示例 2 中以这种方式调用该方法。我建议您创建 getter() 和 checker() 方法,因为您不希望这样做获取有关对象的信息而无需更改它。这也可以用数据字段来完成,取决于 class 结构。
希望这更容易理解并有所帮助!
在 Java 中,逻辑与运算符 &&
是一个短路运算符,这意味着如果表达式的结果可以单独从左侧操作数确定,则不计算右侧。具体来说,如果左侧的计算结果为假,则整个表达式为假,无需计算右侧即可确定。
在您的函数调用的情况下:
if ( thing.changeSomething() && (thing.shouldDoSomething() ){
//do more things
}
如果 thing.changeSomething()
return 为 false,则 thing.shouldDoSomething()
将不会被调用,因为无论此函数 return 是什么,表达式的计算结果都是 false。所以是的,以上等同于:
if ( thing.changeSomething() ) {
if (thing.shouldDoSomething() ){
//do more things
}
}