2010-10-27 41 views
0

我經常發現自己在那樣的代碼前面:C#的性能和可讀性的按鈕開啓/關閉

if(Something > 0) 
{ 
    btnOne.Enabled = true; 
    btnTwo.Enabled = true; 
    btnThree.Enabled = false: 
} 
else 
{ 
    btnOne.Enabled = false; 
    btnTwo.Enabled = false; 
    btnThree.Enabled = true: 
} 

而且我一直在想,如果這是更好地讓它像,或把這樣的:

bool ButtonEnabled = (Something > 0); 

btnOne.Enabled = ButtonEnabled; 
btnTwo.Enabled = ButtonEnabled; 
btnThree.Enabled = !ButtonEnabled; 

實現的問題是有點議論,讓我們拋開「可讀性」的因素,並專注於性能的因素...會是什麼最好?還有一個任務或條件?

在此先感謝您的建議(或更好的書寫方法)!

編輯:更正了我的第二個片段中的錯誤。 編輯:兩個最初的例子並不相同...

+4

既然它不是你想要的答案,我正在寫評論。當涉及到這樣的代碼時,不要擔心性能問題。大多數情況下它並不重要(除非你在循環中這樣做的可能性很小)。去可讀性! – Hemant 2010-10-27 06:33:19

+1

你的兩個片段並不相同。在第一個'btnThree.Enabled'和'btnFour.Enabled'只有在'Something <= 0'時才被設置(反之亦然),而在第二個按鈕被設置。 – 2010-10-27 07:12:57

+0

是的你說得對,我會稍微糾正一下! – 2010-10-27 07:45:59

回答

5

這取決於被調用的屬性。正如你所知道的,一個物業可以做任何事情。在Windows窗體或WPF中,我不擔心它。我認爲後者的風格是正確和可讀性的。如果您每次都設置了所有必要的變量,那麼丟失某些內容並使一個按鈕處於無效狀態的可能性較小。

我會做這樣的事情

bool ButtonEnabled = (Something > 0); 
btnOne.Enabled = ButtonEnabled; 
btnTwo.Enabled = ButtonEnabled; 
btnThree.Enabled = !ButtonEnabled; 
btnFour.Enabled = !ButtonEnabled; 
+1

+1:當我看到代碼時,我的想法完全一樣。當開發人員忘記關閉控制權時,我已經看到了無數事件,當他應該還是更糟時,在某些情況下忘記啓用它。 – Hemant 2010-10-27 07:11:07

1

無論你在兩者之間可能看到的性能差異在這種情況下最有可能是微不足道的,所以我會選擇一個最具可讀性的。

1

不能的兩段代碼比較,無論在可讀性,也不對性能,因爲它們給出不同的結果。

第一代碼的版本,相當於第二個是:

if(Something > 0) 
{ 
    btnOne.Enabled = true; 
    btnTwo.Enabled = true; 
    btnThree.Enabled = false; 
    btnFour.Enabled = false; 
} 
else 
{ 
    btnOne.Enabled = false; 
    btnTwo.Enabled = false; 
    btnThree.Enabled = true; 
    btnFour.Enabled = true; 
} 

第二碼的版本相當於第一是:

bool ButtonEnabled = (Something > 0); 

btnOne.Enabled = ButtonEnabled ? true : btnOne.Enabled; 
btnTwo.Enabled = ButtonEnabled ? true : btnTwo.Enabled; 
btnThree.Enabled = !ButtonEnabled ? false : btnThree.Enabled; 
btnFour.Enabled = !ButtonEnabled ? false : btnFour.Enabled; 

所以,第一塊代碼顯然比它的等效替代品更高效和可讀,第二塊代碼比同等替代品更短,維護也更容易。

+0

所以在第二種方式中,按鈕將始終保持相同的狀態,cool:p – 2010-10-27 07:03:44

1

是的,不像你的應用程序有同時顯示十萬個按鈕,集中HEAVILY的可讀性,而不是微優化!無論如何,用戶界面層更新控件視覺的時間將比「已啓用」任務長10.000倍!

解決方案2實際上幾乎是您在使用數據綁定時所要做的(您非常接近:p)。其實,你會編寫更多的東西一樣:

public class MyClass { 
    public bool IsSomethingTrue { get; set; } // with notification on property changed 
    public bool IsSomethingFalse { get { return !IsSomethingTrue; } } 

    private AMethod() { 
     ... 
     IsSomethingTrue = Something > 0; 
     ... 
    } 

而且你的UI會是這樣(WPF味):

<Button IsEnabled={Binding IsSomethingTrue} /> <!-- btn 1 --> 
<Button IsEnabled={Binding IsSomethingTrue} /> <!-- btn 2 --> 
<Button IsEnabled={Binding IsSomethingFalse} /> <!-- btn 3 --> 
<Button IsEnabled={Binding IsSomethingFalse} /> <!-- btn 4 --> 
<!-- Want a 5th button ? just add it without changing your code-behind ! --> 

這種模式允許你添加你想要儘可能多的按鈕不改變你方法。當方法趨於相當複雜時,這特別有用,它提高了可讀性。

它適用於WPF,Qt,Java,我認爲Winforms應該提供一些數據綁定功能。