具有按钮启用/禁用的C#性能和可读性

时间:2010-10-27 06:24:13

标签: c# performance readability

我经常发现自己面对那种代码:

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 个答案:

答案 0 :(得分:5)

这取决于被调用的属性。如您所知,物业可以做任何事情。在Windows窗体或WPF中,我不担心它。我认为后一种风格的正确性和可读性。如果每次都设置所有必要的变量,则丢失某些内容并使一个按钮处于无效状态的可能性较小。

我会做类似

的事情
bool ButtonEnabled = (Something > 0);
btnOne.Enabled = ButtonEnabled;
btnTwo.Enabled = ButtonEnabled;
btnThree.Enabled = !ButtonEnabled;
btnFour.Enabled = !ButtonEnabled;

答案 1 :(得分:1)

在这种情况下,您可能会看到两者之间的性能差异很可能是微不足道的,所以我会选择最具可读性的差异。

答案 2 :(得分: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;

因此,第一段代码显然比它的等效替代方案更有效和可读,并且第二段代码比它的等效替代方案更短且更容易维护。

答案 3 :(得分:1)

是的,与您的应用程序不同,同时显示了十万个按钮,将HEAVILY集中在可读性上,而不是微优化!无论如何,UI层更新控件的视觉效果的时间将比“启用”分配长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应该提供一些数据绑定功能。