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() ステートメントを入力する場合と入力しない場合があります。

これは、コンパイラがそのように実行されるコードを生成することを前提としています。Method1() が true を返さない限り Method2() が実行されないことを確実にしたい場合は、次のように記述できます。

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

しかし、それはすべての環境で機能しますか? 将来、おそらく Microsoft 以外の C# コンパイラはこのように動作しますか? 次の仕事で、両方のメソッドが常に呼び出される別の言語が関係している場合はどうでしょうか? 私はその特定の構造に依存しない

于 2009-02-23T22:24:24.760 に答える