0

私はこのような関数を持っています(parentそしてformToBeShownWinFormsフォームインスタンスです):

if (parent == null)
    while (!formToBeShown.IsDisposed)
        Do();
else
    while (!parent.IsDisposed && !formToBeShown.IsDisposed)
        Do();

これらは非常にエレガントではないと思います。Do関数を1回だけ呼び出してもらいたいです。または、すべての条件を1つのwhileループに組み込むことができればさらに良いでしょう。私が脳のおならを持っているかどうかはわかりませんが、これを達成する方法を考えることはできません。いくつかの考え?

4

2 に答える 2

7

以下のコードを使用すると、whileループを1回だけ使用できると思います。

while (!formToBeShown.IsDisposed && (parent == null || !parent.IsDisposed))
        Do();
于 2012-10-16T01:50:47.320 に答える
2

さて、これを論理的に考えてみましょう。

最初のループ条件は、次のように書き出すことができます。

(parent == null && !formToBeShow.IsDisposed)

2番目のループの条件は次のとおりです。

(!parent.IsDisposed && !formToBeShown.IsDisposed)

基本的に3つのブール変数があります。

Let A:parent == null Let B:!formToBeShow.IsDisposed Let C:!parent.IsDisposed

今、あなたは単純化することができます

// Loop1 || Loop2  call Do() When:
(A && B) || (C && B)

ブール論理の規則を使用すると、これは次のようになります。B &&(A || C)

while(!formToBeShow.IsDisposed && (parent == null || !parent.IsDispoed))
    Do();

親==nullチェックが最初に来ることを確認する必要があります。これにより、ショートカットが作成され、nullの逆参照が回避される可能性があります。

ただし、これには問題があります。各ループで(parent == null)をチェックして、追加の作業を行っています。したがって、技術的には、これをループの外に持ち出し、複数の書き込みを行いたい場合は、おそらく正当な理由があります。とはいえ、とても単純なものとしては、おそらくシングルループの方がいいでしょう。

于 2012-10-16T01:56:22.593 に答える