冗余设置控制属性的开销?

问题描述:

我处理大量的代码看起来像这样:冗余设置控制属性的开销?

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; 

我觉得它更容易阅读,我看不到任何性能上的差异,但原开发商必须有一定的理由。 (对吧?)

有什么特别的背景色属性,它是一个环境属性。这意味着如果该属性为从未指定,则控件的BackColor将与父级的BackColor值相同。

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

这可能会使原作者有点瘫痪。但是由于他使用了系统颜色,所以测试不应该是必需的。我认为。

+0

在创建控件时,该值是否为快照?或者将来对父级背景颜色所做的更改是否会影响控件?如果是后者,是否有任何方法来确定控件的背景颜色的真实状态? – supercat 2010-08-31 23:53:41

+0

@超级 - 在逻辑上它只是一个内部标志“BackColor属性设置器被调用”。您无法确定该标志是否已设置。 – 2010-09-01 00:00:15

+0

我没有意识到这一点。我想知道为什么微软似乎喜欢设计其“get”方法不真正返回其状态的控制器属性?对于“SameAsParent”具有特殊的颜色常量,以及ReadOnly“DisplayedBackColor”属性,似乎更有用。 – supercat 2010-09-01 15:53:45

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

+0

所以它纯粹是一个表现的东西? – 2010-08-31 21:14:55

+0

你的意思是'SuspendLayout' /'ResumeLayout'?你的方法似乎是特定于ListViews或什么的。 – recursive 2010-08-31 21:19:58

这些是按钮,对吧?

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

推督促:)

从反射器的代码来看,确实出现了一些小的性能优势。尽管没有意义;所以我个人不会为这个支票而烦恼,除非这个冗员组被确定为瓶颈。特别是,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); 
     } 
    } 
}