繁体   English   中英

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

[英]C# performance and readability with buttons enabling/disabling

我经常发现自己处于这种代码的前面:

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;

意识到这个问题有点争论,让我们撇开“可读性”因素,而专注于性能因素...什么是最好的? 还有一项任务或条件?

预先感谢您的建议(或更好的书写方式)!

编辑:更正了我的第二个片段中的错误。 编辑:两个初始示例不等效...

这取决于所调用的属性。 如您所知,财产可以做任何事情。 在Windows Forms或WPF中,我不必担心。 我为后者的正确性和可读性辩护。 如果您每次都设置所有必需的变量,那么丢失某些东西并使一个按钮处于无效状态的机会就更少了。

我会做类似的事情

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

在这种情况下,您可能会发现两者之间的任何性能差异都将是微不足道的,因此,我将选择可读性最强的一个。

您无法在可读性和性能上都无法比较这两段代码,因为它们会产生不同的结果。

与第二个代码等效的第一个代码的版本为:

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;

因此,第一段代码显然比等效的替代方案更有效,更易读,而第二段代码比等效的替代方案更短且更易于维护。

是的,不像你的应用程序在同一时间显示十万按钮,集中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应该提供一些数据绑定功能。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM