我已经阅读了有关disposing of datasets的文章,但仍然对析构函数有疑问。我知道该帖子基本上说您不需要处理数据集,数据表和数据视图,但是我的数据集是MASSIVE,所以我想尽快释放该内存。因此,我的问题是,即使在调用对象的dispose方法时将处理数据集,我也应该包括析构函数吗?另外,再次向我解释为什么需要“布尔处理”。
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);
}
最佳答案
是的,通常,只要满足以下任一条件,就应该实现full IDisposable pattern:
您的班级分配了非托管资源,或者
您具有实现IDisposable
的托管资源(这意味着它们又具有非托管资源)
终结器(C ++ / C#称为“析构函数”的通用CLR术语)的存在是为了处理由于某种原因未调用Dispose方法的情况。布尔值将传递给受保护的Dispose()
方法,指示从公共Dispose
内部还是从终结器内部调用您。
如果正在调用您的公共Dispose
方法,则该调用堆栈是确定性的:直接调用您的dispose方法,因此您可以安全地在子对象上调用方法(包括Dispose
)。
如果您位于终结器内部,那么您将不知道正在被垃圾回收的其他对象的状况。通常,从终结器内部调用控件上的托管对象的方法可能并不安全。
因此,布尔值基本上表示:“如果为true,则处理所有内容;如果为false,则仅处理我的非托管资源,并让其他人处理。”
关于c# - 我应该在包含数据集的类中添加析构函数/终结器吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10450369/