3

我目前正在为用户控件编写一个相当复杂的绘制方法,涉及大量的绘图代码。我知道所有 GDI+ 资源都需要妥善处理,因此我将每个资源都包装在一个using块中。

但是当我注意到我将三个using块用于三个不同的块时,SolidBrushes我想知道我是否不能重复使用它们。创建 a SolidBrush,用它绘制,分配不同的颜色,绘制其他东西,等等。然后把 aDispose()放在最后。

这样的事情是可取的还是我在这里想得太难了?using我也不特别喜欢彼此嵌套的太多块。虽然是一个很好的模式,但它有时会阻碍可读性。

4

3 回答 3

5

好吧,重用是一种优化,它可能为时过早,因此:是的,这是一种不好的做法。我会等待一个明显的性能问题浮出水面,然后寻找瓶颈。您将用一些(未知的)性能增益来换取管理这些组件状态的快速增加的复杂性。

附带说明一下,一种几乎可以接受的嵌套 using-blocks 形式如下所示:

 using (var a = ...)
 using (var b = ...)
 using (var c = ...)
 {

 }
于 2009-09-29T10:17:07.783 回答
1

重用 GDI 对象本身并不坏。糟糕的是,当一次存在的 GDI 对象过多时,您的显卡GDI 无法处理。

由于缓存虚线笔和一些画笔,我早些时候遇到了问题。我同事的代码(在同一个 WM_PAINT 中运行)完全没有问题,即使它没有缓存任何对象!只有我的聪明才智导致 GDI 阻塞并抛出 OutOfMemoryException(它们可能意味着显卡内存不足)。

于 2009-09-29T10:16:28.960 回答
1

我认为这种做法没有什么不好。但我认为你可以重复使用创建的画笔。在我自己的用户控件中,如果我使用画笔,我将它们存储在用户控件的局部变量中,并在我处置用户控件时处置它们。

public class MyUserControl : UserControl{

  private SolidBrush _brush;

  public MyUserControl() {
    _brush = new SolidBrush(Color.Red);
  }

  protected override void OnPaint(PaintEventArgs e){
    // Draw with the brush;
  }

  protected override void Dispose(bool disposing){
    // other Dispose logic
    if (_brush != null) {
      _brush.Dispose();
    }
  }
}
于 2009-09-29T10:17:50.327 回答