2011-03-01 40 views
1

我有這個功能對以下清理交替代碼

bool flag = true; 
while(true){ 
    if(flag){ 
     function1(); 
    }else{ 
     function2(); 
    } 
    flag = !flag; 
} 

我看着它,它並沒有真正似乎乾淨。我只是想在這兩個功能之間切換。有沒有辦法讓這個更清潔一點,更具可讀性,或者你只是保持這種方式?因爲現在我有5行代碼似乎有點混亂。

PS:while(true)實際上並不是代碼的一部分,只是一段演示,它已經持續了一段時間。

+2

我假設'bool flag = true'是爲了超出for循環嗎? – 2011-03-01 17:49:59

+0

呵呵,是的,你可以。謝謝你;) – 2011-03-01 17:51:08

+0

你的例子寫入標誌的方式永遠是真的嗎? – 2011-03-01 17:51:28

回答

3

恕我直言,沒關係。很明顯是什麼意思。

0

你可以做的東西像一個C#EQIV。 JQuery的切換,使用lambdas。

0

這是令人失望的,你不能只寫:

(flag) ? function1() : function2(); 

但是,這不是有效的。

如果function1function2返還相同種類,你可以寫:

var trash = (flag) ? function1() : function2(); 

這是否是更具可讀性是值得商榷的。

,當然,還有把一切在一行中的選項:

if (flag) function1(); else function2(); 

再次,可讀性是值得商榷的。如果這種事情在你的代碼中普遍存在,那麼可以說這是一種常見的習慣用法。但總的來說,我會在代碼審查中勸阻這樣的事情。

再次,如果它在你的代碼普遍的,你可以寫一個方法來爲您處理:

bool IfTrueFalseToggle(bool flag, Action trueFunc, Action falseFunc) 
{ 
    if (flag) 
     trueFunc(); 
    else 
     falseFunc(); 
    return !flag; 
} 

然後你會跟調用它:

flag = IfTrueFalseToggle(flag, function1, function2); 

它可能需要一個更好的名字,除非我有很多使用它的代碼,否則我不會走這條路。另外,您可能最終不得不編寫數十億種不同的類似方法來處理您想與之通話的所有不同類型的ActionFunc

所有考慮的事情,我會說,一般來說,你有什麼是乾淨的,因爲它會得到。

0

這個怎麼樣

bool flag = true; 
while (true) 
{    
     // xor operator   
     if (flag ^= true) 
     { 
       function1(); 
     } 
     else 
     { 
       function2(); 
     } 

} 
+0

是的,我想那樣。我知道這是xor操作符。但我不確定它會提高任何可用性,因爲人們可能會輕鬆閱讀它。 – 2011-03-01 20:17:47

1

發現這個剛纔:將答案(似乎不是編輯在引入新的信息,因爲OP將被通知更好)。

public IEnumerable<bool> AlternatingBools() { 
    bool cur = false; 
    while (true) { 
    yield return cur; 
    cur = !cur; 
    } 
}