【问题标题】:C# performance and readability with buttons enabling/disabling启用/禁用按钮的 C# 性能和可读性
【发布时间】:2010-10-27 06:24:12
【问题描述】:

我经常遇到这种代码:

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;

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

提前感谢您的建议(或者更好的编写方式)!

编辑:更正了我的第二个 sn-p 中的一个错误。 编辑:两个最初的例子不等价...

【问题讨论】:

  • 既然不是你想要的答案,我就写在评论里。当涉及到这样的代码时,不要担心性能。大多数时候这并不重要(除非你是在一个不太可能的循环中这样做)。追求可读性!
  • 你的两个sn-ps不等价。第一个 btnThree.EnabledbtnFour.Enabled 仅在 Something <= 0 时设置(其他两个按钮反之亦然),而在第二个中,所有按钮都已设置。
  • 是的,你是对的,我会稍微更正一下!

标签: c# performance readability


【解决方案1】:

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

我会做类似的事情

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

【讨论】:

  • +1:当我看到代码时,我的想法完全一样。我见过无数的事件,当开发人员在他应该禁用的时候忘记禁用控件,或者更糟糕的是,在某些情况下忘记启用它。
【解决方案2】:

在这种情况下,无论您在两者之间看到的性能差异如何,很可能都是微不足道的,所以我会选择最易读的一个。

【讨论】:

    【解决方案3】:

    是的,与您的应用程序同时显示十万个按钮不同,请关注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 应该提供一些数据绑定功能。

    【讨论】:

      【解决方案4】:

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

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

      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;
      

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

      【讨论】:

      • 所以在第二种方式中,按钮将始终保持相同的状态,很酷:p
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-15
      • 2012-02-17
      • 1970-01-01
      • 1970-01-01
      • 2015-04-19
      相关资源
      最近更新 更多