为什么不直接暴露画笔而不是控件的Color属性?

Ama*_*mal 2 c# controls winforms

一般情况下,Control的背景颜色设置将在OnPaint()中绘制,并使用如下所示的控件背景颜色创建画笔,

using (SolidBrush brush = new SolidBrush(this.BackColor))
{
   e.Graphics.FillRectangle(brush, e.ClipRectangle);
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,为什么颜色暴露在外面以及为什么刷子是在内部创建的.

而不是像Color BackColor,Color ForeColor那样暴露颜色属性.为什么我们不能直接将画笔暴露给控件,如Brush BackgroundBrush,Brush ForegroundBrush?

问候,

Han*_*ant 6

这两种类型之间存在巨大差异.System.Drawing.Color是一个简单的值类型,一个struct.没有做任何特别的事情,它基本上只存储颜色的alpha,红色,绿色和蓝色组件.没有麻烦,没有大惊小怪.

SolidBrush有更多的重量.它是一种非常便宜的类(小于一微秒)但存储起来非常昂贵.它是操作系统对象的包装类,画笔存储在桌面堆上.出于appcompat原因,一直回到Win3,桌面上运行的所有应用程序都需要共享该堆,并且它不能存储超过65535个对象.这迫使Microsoft程序员实现IDisposable以确保在垃圾收集器调用终结器之前足够早地销毁本机对象.并为此代码使用该using语句.

请注意Brushes类,它具有方便的花花公子属性,可提供指定颜色的实心画笔.非常类似于Color类型可以提供命名颜色,如Color.AliceBlue vs Brushes.AliceBlue.方便,但在引擎盖下不那么漂亮,刷子对象在应用程序的生命周期中存在.一个可以接受的折衷方案,假设是应用程序经常使用画笔,而且命名颜色太少会冒着耗尽桌面堆的风险.在这种情况下不可用,this.BackColor可以是任何颜色.