查看MSDN
的示例代码// Design pattern for a base class.
public class Base: IDisposable
{
private bool disposed = false;
//Implement IDisposable.
public void Dispose()
{
Dispose(true); <---- 1 Here
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if (!disposed)
{
if (disposing)
{
// Free other state (managed objects).
}
// Free your own state (unmanaged objects).
// Set large fields to null.
disposed = true;
}
}
// Use C# destructor syntax for finalization code.
~Base()
{
// Simply call Dispose(false).
Dispose (false);
}
}
我似乎没有得到第一个箭头指向的代码行(&lt; ----- 1 Here)。
我在第一个箭头中对于Dispose属于谁而感到困惑。到IDisposable或基础的虚拟处理?
任何有助于我的帮助都很棒,非常感谢!
答案 0 :(得分:4)
/**
* Push a value onto a session array.
*
* @param string $key
* @param mixed $value
* @return void
*/
public function push($key, $value)
{
$array = $this->get($key, array());
$array[] = $value;
$this->put($key, $array);
}
/ Dispose(true)
的目的是让真正的代码 - Dispose(false)
- 知道是通过dispose还是finalize来调用它。 virtual void Dispose(bool)
特定于类(虚方法); Dispose(bool)
只有无参数IDisposable
方法。就这样:
Dispose()
路线只能通过Dispose(true)
来调用 - 这通常意味着通过IDisposable
using
路由(请注意Dispose(false)
路线在完成后禁用完成步骤
此布尔标志很重要,因为在最终确定期间,您无法触及任何其他托管资源(因为顺序是非确定性的) - 只是非托管。此方法为Dispose(true)
这一事实意味着子类可以将自己的清理代码添加到组合中。
但实际上,您需要实现终结器非常罕见;你不应该经常添加这么多的样板。
答案 1 :(得分:2)
在这种情况下,Dispose属于调用者aka dev。
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
这永远不会自动调用,但始终由开发人员调用。 true
标志表示已明确调用dispose。 GC.SuppressFinalize(this);
告诉垃圾收集器已经处理了该对象的处理。无需调用finalize块。
~Base()
{
// Simply call Dispose(false).
Dispose (false);
}
如果尚未明确处置该对象,则垃圾收集器会自动调用此方法。它确切地被调用时是不确定的,但有时当对象超出范围并被标记为垃圾收集时。 false
标志表示这是一个自动处理,在这种情况下,不再需要明确处理托管对象。
此外,还有关于Ben Watson编写高性能.NET代码的终结器的补充说明
除非需要,否则不要实施终结器。终结器是由垃圾触发的代码 收集器清理非托管资源。它们是从单个线程调用的,一个在后面 另外,只有在垃圾收集器声明对象在收集后死亡之后。这个 意味着如果你的类实现了终结器,你就可以保证它会留在内存中 甚至在应该杀死它的收集之后。这降低了整体GC效率 确保您的程序将专用CPU资源来清理对象。
答案 2 :(得分:0)
此实施:
public void Dispose(){...}
用于使用此类的Dispose方法中的其他人。这个实现:
protected virtual void Dispose(bool disposing){...}
用于使用类本身意味着如果其他人在他们的代码上使用Dispose()
,那么可以做一些在受保护方法上管理的其他东西,但是如果垃圾收集器处理它,它就不会运行托管代码