Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何干燥这两个“当条件做”?_C#_While Loop_Dry - Fatal编程技术网

C# 如何干燥这两个“当条件做”?

C# 如何干燥这两个“当条件做”?,c#,while-loop,dry,C#,While Loop,Dry,我有一个类似这样的父函数,FormToBeshow是WinForms表单实例: if (parent == null) while (!formToBeShown.IsDisposed) Do(); else while (!parent.IsDisposed && !formToBeShown.IsDisposed) Do(); 我觉得这些非常不雅。我希望只调用一次Do函数。如果我能将所有条件合并到一个while循环中,那就更好

我有一个类似这样的父函数,FormToBeshow是WinForms表单实例:

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

我觉得这些非常不雅。我希望只调用一次Do函数。如果我能将所有条件合并到一个while循环中,那就更好了。我不知道我是否有大脑放屁,但我想不出一个方法来实现这一点。一些想法?

我认为使用下面的代码,您只能使用while循环一次

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

我们从逻辑上考虑这个问题。

第一个循环条件可以写成如下:

(parent == null && !formToBeShow.IsDisposed)
第二个循环的条件是:

(!parent.IsDisposed && !formToBeShown.IsDisposed)
基本上有3个布尔变量:

设A:parent==null 让B:!formToBeShow.IsDisposed 让C:!parent.IsDisposed

现在您可以简化为

// Loop1 || Loop2  call Do() When:
(A && B) || (C && B)
使用布尔逻辑规则,这将变成: B&A|C

while(!formToBeShow.IsDisposed && (parent == null || !parent.IsDispoed))
    Do();
您需要确保首先进行parent==null检查,以避免尝试取消引用null


不过,这有一个问题,通过在每个循环上检查parent==null,您正在做额外的工作。所以,从技术上讲,如果你想把它带到循环之外,并编写多个循环,你可能有理由这样做。不过,对于这么简单的东西,我可能更喜欢单循环。

谢谢你的解释。让我来回答马克·贾格斯的问题,因为他是第一个提出这两个答案都是正确的,但有时这不是看谁先得到答案的竞赛,而是谁花时间回答并解释原因的竞赛。未来的读者将从@Alan那里得到更有益的答案。。。只是说说而已。