我已经通读了这篇关于disposing of datasets的文章,但我仍然有一个关于析构函数的问题。我知道这篇文章基本上是说你不需要处理数据集、数据表和数据视图,但我的数据集很大,所以我想尽快释放内存。那么,我的问题是,即使调用对象的dispose方法时dataset将被释放,我是否应该包括析构函数?另外,再次向我解释为什么需要“布尔处理”。
public DEditUtil(DataSet dsTxData)
{
this.dsTxData = dsTxData;
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if (!disposed)
{
if (disposing)
dsTxData.Dispose();
disposed = true;
}
}
~DEditUtil()
{
Dispose(false);
}
发布于 2012-05-04 14:07:36
是的,通常情况下,只要满足以下任一条件,您就应该实现full IDisposable pattern:
IDisposable
的托管资源(这意味着它们又拥有非托管资源)终结器( C++/C#称之为“析构函数”的通用CLR术语)的存在是为了处理由于某种原因而不调用Dispose方法的情况。传递到受保护的Dispose()
方法的布尔值,指示是从公共Dispose
内部还是从终结器内部调用您。
如果您公共dispose方法被调用,那么调用堆栈就是确定性的:dispose方法是直接调用的,因此您可以安全地调用子对象上的方法(包括Dispose
)。
如果您在终结器内部,那么您不知道其他也被垃圾回收的对象发生了什么。通常,从终结器中调用托管对象上的方法可能是不安全的。
因此,布尔值基本上是说:“如果为true,则处置所有资源;如果为false,则仅处置我的非托管资源,并让其他所有人处理他们的资源。”
发布于 2012-05-04 14:07:26
一旦代码不再引用DataSet
对象使用的内存,它就可以用于垃圾回收。
垃圾收集器将在稍后(不确定的)时间使该内存对程序可用。
这两件事都不依赖于是否有析构函数或对Dispose
的调用,所以答案是否定的-你不需要析构函数。
发布于 2012-05-04 14:05:40
不,你不需要在这里调用任何其他方法,你所做的已经足够了。Dispose
将由运行时调用,您将释放分配的资源,清理工作留给GC来决定如何以及何时执行。
如果你真的有内存的巨大问题,你可以尝试调用GC.Collect()
来强制垃圾收集,这通常是有效的,但以这种方式使用它从来都不是一个好的做法,所以尽量避免它。
编辑
根据评论,重要的是要注意你的案例中的执行流程,因为如果不是disposed==false
和disposing == true
,DataSet
清理将只在中完成,而从提供的代码来看,这将是一个案例,只有在代码中进行显式调用时才会执行。
https://stackoverflow.com/questions/10450369
复制相似问题