冗余设置控制属性的开销?
我处理大量的代码看起来像这样:冗余设置控制属性的开销?
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,则所有子控件都将其更改为相同的值。只要他们自己没有分配它。
这可能会使原作者有点瘫痪。但是由于他使用了系统颜色,所以测试不应该是必需的。我认为。
我会怀疑设置一个像BackColor一样的视觉属性会导致控件失效作为这样做的原因(尽管仍然有点误导)。因此,更好的解决方案是将这些更改夹在BeginUpdate()
和EndUpdate()
调用之间,无论您做什么,都会导致一次失效。
所以它纯粹是一个表现的东西? – 2010-08-31 21:14:55
你的意思是'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);
}
}
}
在创建控件时,该值是否为快照?或者将来对父级背景颜色所做的更改是否会影响控件?如果是后者,是否有任何方法来确定控件的背景颜色的真实状态? – supercat 2010-08-31 23:53:41
@超级 - 在逻辑上它只是一个内部标志“BackColor属性设置器被调用”。您无法确定该标志是否已设置。 – 2010-09-01 00:00:15
我没有意识到这一点。我想知道为什么微软似乎喜欢设计其“get”方法不真正返回其状态的控制器属性?对于“SameAsParent”具有特殊的颜色常量,以及ReadOnly“DisplayedBackColor”属性,似乎更有用。 – supercat 2010-09-01 15:53:45