代码之家  ›  专栏  ›  技术社区  ›  Andy M

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

  •  0
  • Andy M  · 技术社区  · 14 年前

    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 回复  |  直到 14 年前
        1
  •  5
  •   Robert Jeppesen    14 年前

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

    我会做一些像

    bool ButtonEnabled = (Something > 0);
    btnOne.Enabled = ButtonEnabled;
    btnTwo.Enabled = ButtonEnabled;
    btnThree.Enabled = !ButtonEnabled;
    btnFour.Enabled = !ButtonEnabled;
    
        2
  •  1
  •   Brian Rasmussen    14 年前

        3
  •  1
  •   Aurelien Ribon    14 年前

    是的,不像你的应用程序有十万个按钮同时显示,集中精力 HEAVILY

    解决方案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;
            ...
        }
    

    你的用户界面应该是(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应该提供一些数据绑定功能。

        4
  •  1
  •   Guffa    14 年前

    您不能比较这两段代码,无论是可读性还是性能,因为它们给出的结果不同。

    第一个代码的版本相当于第二个代码的版本是:

    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;