我有两种方法可以根据它们的成功返回bool,在IF()中调用这些方法有什么问题吗?
//&& makes sure that Method2() will only get called if Method1() returned true, use & to call both methods
if(Method1() && Method2())
{
// do stuff if both methods returned TRUE
}
如果Method1()返回FALSE,则不需要触发Method2()。
让我知道上面的代码有任何问题。
谢谢。编辑:由于代码没有任何问题,我会接受最丰富的答案...添加评论以解决“新手&&&&”问题
答案 0 :(得分:21)
我会说你可以使用& operator
(而不是&&
)来保证即使左侧是false
也调用这两个方法,如果由于某种原因,您希望避免短路。
反向适用于| operator
,即使左手条件评估为true
,也会评估右手条件。
答案 1 :(得分:19)
不,if条件中的方法调用没有任何问题。实际上,这可以是让代码更具可读性的好方法!
例如,写起来要干净得多:
private bool AllActive()
{
return x.IsActive && y.IsActive && z.IsActive;
}
if(AllActive())
{
//do stuff
}
比:
if(x.IsActive && y.IsActive && z.IsActive)
{
//do stuff
}
答案 2 :(得分:2)
虽然它们很有用,但序列点可能会令人困惑。除非你真的明白这一点,否则根本不会调用Method2()。另一方面,如果你需要两个方法来调用AND它们必须返回true,你会写什么?你可以选择
bool result1 = Method1();
bool result2 = Method2();
if (result1 && result2)
{
}
或者你可以选择
if (Method1())
if (Method2())
{
}
所以我猜你回答的问题是恕我直言,不,你的意思并不清楚你的意思,即使你的行为是你所描述的。
答案 3 :(得分:2)
如果方法是纯粹的(无副作用)函数,我只会推荐它。
答案 4 :(得分:2)
然而,正如每个人所说的那样,以这种方式做事并没有“错误”,而且在很多情况下,你正在做的正是语言的设计目的。
但是,请记住,为了维护性,如果Method2有副作用(也就是说,它会改变某些状态),那么这个函数没有被调用可能并不明显(一个优秀的程序员通常会知道,但是优秀的程序员有时会有脑屁。)
如果短路表达有某种副作用,那么从维护的角度来看,分离语句可能更具可读性。
答案 5 :(得分:1)
对我来说很好,如果先前的条件失败,if()块中的多个子句将会短路。
答案 6 :(得分:1)
应该没有任何问题。
正常行为是Method1()将执行,如果返回true,则执行Method2(),并且根据Method2()返回的内容,您可能/可能不会输入if()语句。
现在,假定编译器生成以这种方式执行的代码。如果你想完全确定,除非Method1()返回true,否则Method2()不会执行,你可以像这样写
if( Method1() )
{
if( Method2() )
{
// do stuff if both methods returned TRUE
}
}
但是,我一直注意到你的代码会按预期运行,所以这可能不是必需的。
答案 7 :(得分:0)
没错。
实际上......我不会将它们命名为Method1和Method2。更具描述性的东西。也许被动发声(如StuffHasHappened或DataHasLoaded)
答案 8 :(得分:0)
对我来说很好看,但有一些警告......这不是适用一揽子规则的事情。
我的指南是:
if
语句中有太多的语句/方法调用,那么您很可能正在比较多个“一组”事物。打破这些“集合”并引入临时变量。if( Open(host) )
比if( WeCouldConnectToTheServer )
短。所有这些项目的总大小归结为它。答案 9 :(得分:-2)
就个人而言,我会考虑
if(Method1() && Method2())
{
// do stuff if both methods returned TRUE
}
是一种不好的做法。是的,它适用于当前环境,但
也是如此if(Method1())
{
if (Method2())
{
// do stuff if both methods returned TRUE
}
}
但它会在所有环境中运行吗?未来,可能是非Microsoft,C#编译器会以这种方式工作吗?如果您的下一个工作涉及另一种语言,其中两种方法将永远被调用怎么办我不会依赖于那个特定的构造,不是因为它错了,而是因为它没有解决任何严重的问题,并且将来可能会出错