例如,我有一个方法
SomeMethod(Graphics g)
{
...
}
Run Code Online (Sandbox Code Playgroud)
如果我以某种方式调用此方法
SomeMethod(new Graphics())
Run Code Online (Sandbox Code Playgroud)
我的图形对象是自动曝光还是应该g.Dispose() 在方法结束时手动调用?
SomeMethod(Graphics g)
{
...
g.Dispose();
}
Run Code Online (Sandbox Code Playgroud)
一次性对象不会自动解决(他们可以达到最接近的目标是实现Dispose必要时调用的Finalizer ).您必须通过调用Dispose()或将其与using块一起使用来手动执行此操作.
如果要自动释放对象,可以执行以下操作:
using (var g = new Graphics()) {
SomeMethod(g);
}
Run Code Online (Sandbox Code Playgroud)
using块确保Dispose()一旦块结束就自动调用该方法(因此在这种情况下,在SomeMethod返回或抛出异常之后).
注意:如果可能,您应该将对象放置在您创建对象附近的位置.接收有效对象并将其丢弃在方法中可能会导致混淆.
图形和可能大多数(如果不是全部)实现此接口的BCL类也将Dispose()在调用Finalizer时调用.这是正确实施的一部分IDisposable.但是,您永远不知道何时调用终结器,如果您需要确定性地处理对象,则不应该依赖此实现细节.