代码之家  ›  专栏  ›  技术社区  ›  recursive

冗余设置控件属性有什么开销吗?

  •  2
  • recursive  · 技术社区  · 14 年前

    我正在处理很多类似这样的代码:

     if (btnLeftDock.BackColor != SystemColors.ButtonFace)
     {
        btnLeftDock.BackColor = SystemColors.ButtonFace;
     }
     if (btnRightDock.BackColor != SystemColors.ButtonFace)
     {
        btnRightDock.BackColor = SystemColors.ButtonFace;
     }
     if (btnTopDock.BackColor != SystemColors.ButtonFace)
     {
        btnTopDock.BackColor = SystemColors.ButtonFace;
     }
     if (btnBottomDock.BackColor != SystemColors.ButtonFace)
     {
        btnBottomDock.BackColor = SystemColors.ButtonFace;
     }
    

     btnLeftDock.BackColor = SystemColors.ButtonFace;
     btnRightDock.BackColor = SystemColors.ButtonFace;
     btnTopDock.BackColor = SystemColors.ButtonFace;
     btnBottomDock.BackColor = SystemColors.ButtonFace;
    

    我认为它更容易阅读,我看不出任何性能上的差异,但最初的开发人员 必须 有一些理由。(对吗?)

    4 回复  |  直到 14 年前
        1
  •  1
  •   Hans Passant    14 年前

    BackColor属性有一些特别的地方,它是一个 环境属性 从未 赋值后,控件的BackColor将与父控件的BackColor值相同。

    这可能会让原作者有点瘫痪。但既然他用的是系统颜色,测试就没必要了。我想。

        2
  •  1
  •   Rob Fonseca-Ensor    14 年前

    这些是纽扣,对吗?

    您应该发现BackColorChanged没有被触发,所以我无法想象原始开发人员试图避免的任何功能性副作用。

    推到prod:)

        3
  •  1
  •   Ani    14 年前

    从reflector的代码来看,确实存在一些性能上的小优势。但是没有什么意义;所以我个人不会为检查而烦恼,除非redunant集被确定为瓶颈。特别是 OnBackColorChanged 处理者将 在冗余集上执行。


    public override Color BackColor
    {
        set
        {
            if (base.DesignMode)
            {
                if (value != Color.Empty)
                {
                    PropertyDescriptor descriptor = TypeDescriptor.GetProperties(this)["UseVisualStyleBackColor"];
                    if (descriptor != null)
                    {
                        descriptor.SetValue(this, false);
                    }
                }
            }
            else
            {
                this.UseVisualStyleBackColor = false;
            }
            base.BackColor = value;
        }
    }
    

    base.BackColor ,定义于 System.Windows.Forms.Control

    public virtual Color BackColor
    {
        set
        {
            if ((!value.Equals(Color.Empty) && !this.GetStyle(ControlStyles.SupportsTransparentBackColor)) && (value.A < 0xff))
            {
                throw new ArgumentException(SR.GetString("TransparentBackColorNotAllowed"));
            }
            Color backColor = this.BackColor;
            if (!value.IsEmpty || this.Properties.ContainsObject(PropBackColor))
            {
                this.Properties.SetColor(PropBackColor, value);
            }
            if (!backColor.Equals(this.BackColor))
            {
                this.OnBackColorChanged(EventArgs.Empty);
            }
        }
    }
    
        4
  •  0
  •   Matt Greer    14 年前

    我怀疑设置BackColor这样的视觉属性会导致控件失效,因为这样做的原因(尽管仍然有点误导)。所以一个更好的解决办法就是把这些变化夹在 BeginUpdate() EndUpdate()