2010-10-27 44 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应该提供一些数据绑定功能。