冗余设置Control属性的任何开销?

时间:2010-08-31 21:08:09

标签: c# winforms

我正在处理许多看起来像这样的代码:

 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;
 }

我可以想象这样做的唯一原因是理论上有一些特定于winforms的开销来设置这样的控制颜色:

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

我认为它更容易阅读,我看不出任何性能差异,但原始开发人员必须有一些理由。 (右?)

4 个答案:

答案 0 :(得分:1)

这些是按钮,对吧?

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

将它推到prod:)

答案 1 :(得分:1)

查看反射器的代码,确实会有一些轻微的性能优势。没什么重要意义;所以我个人不会打扰检查,除非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);
        }
    }
}

答案 2 :(得分:1)

BackColor属性有一些特殊之处,它是环境属性。这意味着如果属性从未分配,则控件的BackColor将与父级的BackColor值相同。

非常需要,它提供自动一致的背景颜色值。如果父级更改其BackColor,则所有子控件也将其更改为相同的值。只要他们自己没有分配它。

这可能使原作者陷入瘫痪。但由于他使用的是系统颜色,因此测试不应该是必要的。我想。

答案 3 :(得分:0)

我怀疑设置像BackColor这样的视觉属性会导致控件失效,因为这样做的原因(虽然仍然有点误导)。因此,更好的解决方案是将这些更改夹在BeginUpdate()EndUpdate()之间,无论您做什么,都会导致一次失效。