调用if()中的方法 - C#

时间:2009-02-23 21:06:31

标签: c# language-features short-circuiting

我有两种方法可以根据它们的成功返回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()。

让我知道上面的代码有任何问题。

谢谢。

编辑:由于代码没有任何问题,我会接受最丰富的答案...添加评论以解决“新手&&&&”问题

10 个答案:

答案 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语句中有太多的语句/方法调用,那么您很可能正在比较多个“一组”事物。打破这些“集合”并引入临时变量。
  • “太多”是主观的,但通常超过3
  • 当我说“方法名称很短”时,我不只是谈论名称,而是谈论他们所采用的参数。基本上是某人阅读它所需的努力。例如,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#编译器会以这种方式工作吗?如果您的下一个工作涉及另一种语言,其中两种方法将永远被调用怎么办我不会依赖于那个特定的构造,不是因为它错了,而是因为它没有解决任何严重的问题,并且将来可能会出错

相关问题