C# 在绘图功能中创建新的画笔可以吗?

C# 在绘图功能中创建新的画笔可以吗?,c#,paint,C#,Paint,在everytime Paint函数中创建一支新笔是否称为危险?它会使用大量内存吗 那么,我应该用哪一个呢 private void Form1_Paint(object sender, PaintEventArgs e) { e.Graphics.DrawLine(new Pen(Color.Black..... 或 Pen实现了IDisposable,这意味着一旦不再需要它,就应该将其处理掉。您不应该直接在DrwaLine调用中创建它(因为无法处理它)。它也不应该是类成员,假

在everytime Paint函数中创建一支新笔是否称为危险?它会使用大量内存吗

那么,我应该用哪一个呢

 private void Form1_Paint(object sender, PaintEventArgs e)
 {
     e.Graphics.DrawLine(new Pen(Color.Black.....


Pen
实现了
IDisposable
,这意味着一旦不再需要它,就应该将其处理掉。您不应该直接在
DrwaLine
调用中创建它(因为无法处理它)。它也不应该是类成员,假设它只用于
DrawLine
调用

更好的办法是:

private void Form1_Paint(object sender, PaintEventArgs e)
{
    using(Pen pen = new Pen(Color.Black))
    {
        e.Graphics.DrawLine(tpen, ...);
    }
}
这样即使发生异常,笔也会被丢弃

如果只设置颜色,则可以使用静态
画笔将其内联。黑色
属性:

e.Graphics.DrawLine(Pens.Black, ...);

由于对象将由
类缓存,因此您无需担心如何处理它。

实现了
IDisposable
,这意味着它应该在不再需要时立即处理。您不应该直接在
DrwaLine
调用中创建它(因为无法处理它)。它也不应该是类成员,假设它只用于
DrawLine
调用

更好的办法是:

private void Form1_Paint(object sender, PaintEventArgs e)
{
    using(Pen pen = new Pen(Color.Black))
    {
        e.Graphics.DrawLine(tpen, ...);
    }
}
这样即使发生异常,笔也会被丢弃

如果只设置颜色,则可以使用静态
画笔将其内联。黑色
属性:

e.Graphics.DrawLine(Pens.Black, ...);
因为对象将被
类缓存,您不必担心如何处理它。

  • 如果您不更改
    属性,您只需使用
    笔。黑色
    ,这是一种您甚至无法处理的标准

  • 如果您知道您将只使用几支
    ,则可以在程序运行时保留它们

  • 如果您需要创建大量或未知数量的
    ,可能需要处理一个绘图操作文件,然后使用
子句在
中创建它们,不必担心创建时间;它发生得很快

使用它们不是关于内存,而是关于
GDI
资源,这些资源有些有限,因此必须不泄漏。

  • 如果您不更改
    属性,您只需使用
    笔。黑色
    ,这是一种您甚至无法处理的标准

  • 如果您知道您将只使用几支
    ,则可以在程序运行时保留它们

  • 如果您需要创建大量或未知数量的
    ,可能需要处理一个绘图操作文件,然后使用
子句在
中创建它们,不必担心创建时间;它发生得很快


使用它们不是关于内存,而是关于
GDI
资源,这些资源有些有限,因此必须不泄漏..

我认为第二个版本更好。油漆事件可能会频繁发生,因此没有理由每次都创建新笔。危险吗?是的,它可以召唤狼人。高内存量?是的,你的机器几秒钟后就会崩溃。更严肃地说:你怎么看?你做过什么调查吗?你看到了吗?你知道垃圾收集是什么吗?你解决问题了吗?我想第二个版本更好。油漆事件可能会频繁发生,因此没有理由每次都创建新笔。危险吗?是的,它可以召唤狼人。高内存量?是的,你的机器几秒钟后就会崩溃。更严肃地说:你怎么看?你做过什么调查吗?你看到了吗?你知道垃圾收集是什么吗?你的问题解决了吗?我同意;将笔创建为类字段的好处很小,但使用
是必不可少的。事实上,您不应该创建GDI对象并将其挂起!创建它们、使用它们、处置它们。GDI对象可能是有限的。@MatthewWatson GDI对象可能是有限的,但是说“不应该创建GDI对象并挂起它们!”我认为这取决于对象的类型<代码>笔
-确定<代码>刷子
确定<代码>字体'可能元文件`也许吧<代码>位图取决于。我不想继续在我喜欢的无闪烁滚动图表控件中创建屏幕外位图,30 FPS。重新创建对象的费用可能超过仅仅抓住它的费用。我唯一一次重新创建它是在调整控件大小的情况下。如果窗口不可见或最小化,请从DirectX/OpenGL中取出一页并释放它们。@MickyDuncan是的,我指的是画笔和类似的东西,而不是位图(这会使双缓冲有点挑战性!),我同意;将笔创建为类字段的好处很小,但使用
是必不可少的。事实上,您不应该创建GDI对象并将其挂起!创建它们、使用它们、处置它们。GDI对象可能是有限的。@MatthewWatson GDI对象可能是有限的,但是说“不应该创建GDI对象并挂起它们!”我认为这取决于对象的类型<代码>笔
-确定<代码>刷子
确定<代码>字体'可能元文件`也许吧<代码>位图取决于。我不想继续在我喜欢的无闪烁滚动图表控件中创建屏幕外位图,30 FPS。重新创建对象的费用可能超过仅仅抓住它的费用。我唯一一次重新创建它是在调整控件大小的情况下。如果窗口不可见或最小化,请从DirectX/OpenGL中取出一页并释放它们。@MickyDuncan是的,我指的是画笔和类似的东西,而不是位图(这会使双缓冲有点挑战性!)