我正在处理许多看起来像这样的代码:
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;
我认为它更容易阅读,我看不出任何性能差异,但原始开发人员必须有一些理由。 (右?)
答案 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()
之间,无论您做什么,都会导致一次失效。