自动调整对象

TOP*_*KEK 5 .net c# dispose

例如,我有一个方法

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)

Bot*_*000 7

一次性对象不会自动解决(他们可以达到最接近的目标是实现Dispose必要时调用的Finalizer ).您必须通过调用Dispose()或将其与using块一起使用来手动执行此操作.

如果要自动释放对象,可以执行以下操作:

using (var g = new Graphics()) {
    SomeMethod(g);
}
Run Code Online (Sandbox Code Playgroud)

using块确保Dispose()一旦块结束就自动调用该方法(因此在这种情况下,在SomeMethod返回或抛出异常之后).

注意:如果可能,您应该将对象放置在您创建对象附近的位置.接收有效对象并将其丢弃在方法中可能会导致混淆.

图形和可能大多数(如果不是全部)实现此接口的BCL类也将Dispose()在调用Finalizer时调用.这是正确实施的一部分IDisposable.但是,您永远不知道何时调用终结器,如果您需要确定性地处理对象,则不应该依赖此实现细节.

  • 事实并非如此.实现IDisposable的所有对象迟早会被处理掉,即使你没有调用Dispose.如果正确遵循IDisposable模式,Finalizer /析构函数应调用Dispose以释放非托管资源.显式调用Dispose只是GC更快地处理对象的一个​​重要因素. (2认同)