我什么时候需要在图形上使用dispose()?

lal*_*ala 20 c# graphics user-interface dispose

我正在学习用C#绘制东西,我一直看到使用dispose()的建议,但我不太明白它的用途.

  • 我什么时候应该在代码绘制的图形上使用dispose()?
  • 如果我不这样做会怎么样?
  • 每次图形不可见时是否需要调用它,例如在具有选项卡的GUI上,用户切换到另一个选项卡,然后在切换回时重绘它?
  • 如果我不打电话,我会打破它吗?
  • 蝙蝠侠会逃脱小丑的邪恶魔掌吗?

Ste*_*ary 30

  • 我什么时候应该在代码绘制的图形上使用dispose()?每当你完成任何实现的对象时IDisposable,你应该Dispose在它有资格进行垃圾收集之前调用它.正如其他人所指出的那样,最好使用using语句而不是Dispose直接调用.
  • 如果我不这样做会怎么样?您的程序效率会稍低,因为它会占用比必要资源略多的资源.这是不处理图形的唯一缺点; 但是,不处理其他类实际上可能会导致错误(一个着名的例子是StreamWriter).因此,IDisposable作为一般规则,最好始终处置任何实现的类.
  • 每次图形不可见时是否需要调用它,例如在具有选项卡的GUI上,用户切换到另一个选项卡,然后在切换回时重绘它?不可以.对象只有在完成后才能进行处理.
  • 如果我不打电话,我会打破它吗?是.如果Dispose在完成对象之前调用,然后尝试使用已处置的对象,则会得到一个ObjectDisposedException.
  • 蝙蝠侠会逃脱小丑的邪恶魔掌吗?明天收听,同样的蝙蝠时间,同样的蝙蝠频道!

  • 这还需要一个规则:do*not*dispose你没有创建的对象.处理e.Graphics是一个讨厌的潜在错误. (18认同)
  • 只是对`Graphics` 的一个特别说明,如果它已经被释放,调用它的`Draw...` 方法将给出一个带有消息“参数无效”的`InvalidArgumentException` - 而不是`ObjectDisposedException`。 (2认同)

Dan*_*Dan 5

当您要求图形对象时,Windows将为您分配一些内存.调用dispose会为你整理那些记忆.如果你不调用dispose,所有这些内存句柄都将保持打开状态,最终你的系统将耗尽资源,变慢并最终停止(关闭程序可能会释放它们).

因为您使用的是.NET,所以当您使用完图形对象后,垃圾收集器最终会为您调用dispose.垃圾收集器的问题是你永远不知道什么时候它会清理对象,所以它可能会使这些资源打开的时间超过必要的时间.

这就是说,你永远不应该自己打电话.更好的方法是将对象放在使用范围内:

using(Graphics g)
{
    // do something with the resource
}
Run Code Online (Sandbox Code Playgroud)

现在当你使用范围离开时,对象将被销毁,并且将自动为你调用dispose.您应该将具有dispose方法的所有对象放在using范围内.