通常,当我覆盖 OnPaint 方法时,我会在其中创建笔和刷子等,然后将它们丢弃。
我还在某处读到,与其重新创建这些笔和画笔等,不如将它们创建为静态成员一次,然后在关闭表单时将它们处理一次,等等。
这是更好的做法吗?
有更好的方法吗?
我可以假设,由于 OnPaint 被调用了 1000 次(?)次,与仅创建一次相比,这将为 GC 带来大量工作。
最佳答案
如果画笔和笔不会改变,那么创建一次并重复使用它们当然更好。但是请注意,如果您的控件可能在多个线程上使用(这种可能性很小),您应该使它们成为 ThreadStatic
(并在每个线程首次使用时进行初始化)或使它们成为实例成员(并且在您的控件的 Dispose
覆盖中处置它们);否则,您将得到不可重现的 GDI+ 错误,因为 GDI+ 对象不能同时在多个线程上使用。图像也是如此。
如果它们确实发生了变化(例如,如果您使用取决于控件大小的渐变画笔),您可能仍希望将它们存储在实例字段中,并在控件大小(或其他)发生变化时重新创建它们。
请注意,顺便说一下,如果您使用普通颜色,则可以使用静态 Brushes
和 Pens
类,其中包含所有 .Net 内置颜色的静态画笔和笔,以及 SystemBrushes
和 SystemPens
用于系统颜色。
关于c# - Winforms 中自定义控件绘画的最佳实践?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1718202/