15

我有几个方法根据它们的成功返回一个布尔值,在 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() 不需要触发。

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

谢谢你。

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

4

10 回答 10

22

我要说明的是,如果您将来出于某种原因希望避免短路,您可以使用& operator(而不是&&)来保证调用这两种方法,即使左侧是,也是如此。false

逆向适用于| operator,即使左侧条件评估为true,右侧条件也将被评估。

于 2009-02-23T21:16:07.670 回答
20

不,if 条件下的方法调用没有任何问题。实际上,这可能是使您的代码更具可读性的好方法!

例如,写起来要干净得多:

private bool AllActive()
{
    return x.IsActive && y.IsActive && z.IsActive;
}

if(AllActive())
{
    //do stuff
}

比:

if(x.IsActive && y.IsActive && z.IsActive)
{
    //do stuff
}
于 2009-02-23T21:09:03.710 回答
2

尽管它们很有用,但序列点可能会令人困惑。除非您真正理解这一点,否则 Method2() 可能根本不会被调用尚不清楚。另一方面,如果您需要调用这两个方法并且它们必须返回 true,您会写什么?你可以和

bool result1 = Method1();
bool result2 = Method2();
if (result1 && result2)
{
}

或者你可以去

if (Method1())
    if (Method2())
    {
    }

因此,我想恕我直言,您的问题的答案是,不,尽管行为将是您所描述的,但您的意思并不完全清楚。

于 2009-02-23T21:11:49.817 回答
2

如果方法是纯(无副作用)功能,我只会推荐它。

于 2009-02-23T21:38:33.857 回答
2

正如每个人所说,以这种方式做事并没有什么“错误”,而且在许多情况下,您所做的正是该语言的设计目的。

但是请记住,为了可维护性,如果 Method2 有副作用(即,它改变了某些状态),那么这个函数没有被调用可能并不明显(一个好的程序员通常会知道,但有时即使是好的程序员有脑放屁)。

如果短路表达式有某种副作用,那么严格从维护的角度来看,将语句分开可能更具可读性。

于 2009-02-23T21:45:07.930 回答
1

对我来说看起来不错,如果早期条件失败,if() 块中的多个子句将短路。

于 2009-02-23T21:12:20.067 回答
1

应该没有问题。

正常行为是 Method1() 将执行,如果返回 true Method2() 将执行,并且根据 Method2() 返回的内容,您可能/可能不输入 if() 语句。

现在,这假设编译器生成以这种方式执行的代码。如果你想绝对确定Method2() 不会执行,除非 Method1() 返回 true 你可以这样写

if( Method1() )
{
  if( Method2() )
  {
    // do stuff if both methods returned TRUE 
  }
}

但是,我一直观察到您的代码将按预期运行,因此这可能没有必要。

于 2009-02-23T21:13:30.313 回答
0

没有错。

实际上...我不会将它们命名为 Method1 和 Method2。更具描述性的东西。也可能是被动的声音(比如 StuffHasHappened 或 DataHasLoaded)

于 2009-02-23T21:08:49.233 回答
0

对我来说看起来不错,但有一些警告......这不是适用一揽子规则的事情。

我的指导方针是:

  • 如果方法名很短,而且没有太多,那就没问题了。
  • 如果您在语句中有太多的语句/方法调用if,那么您很可能正在比较多个“集合”的事物。打破这些“集合”并引入临时变量。
  • “太多”是主观的,但通常超过 3 个左右
  • 当我说“方法名称很短”时,我说的不仅仅是名称,还有它们所采用的参数。基本上是某人阅读它所需的努力。例如if( Open(host) )比 短if( WeCouldConnectToTheServer )。所有这些项目的总大小就是归结为。
于 2009-02-23T22:35:01.007 回答
-2

就个人而言,我会考虑

if(Method1() && Method2())
{
    // do stuff if both methods returned TRUE
}

成为一种不好的做法。是的,它适用于当前环境,但也适用

if(Method1())
{
  if (Method2())
  {
    // do stuff if both methods returned TRUE
  }
}

但它会在所有环境中工作吗?未来,可能是非微软的 C# 编译器会以这种方式工作吗?如果您的下一份工作涉及另一种语言,而这两种方法都将被调用,该怎么办?我不会依赖那个特定的构造,不是因为它是错误的,而是因为它不能解决任何严重的问题,而且将来可能会出错

于 2009-02-23T22:24:24.760 回答