C# 我应该向包含数据集的类添加析构函数/终结器吗?
我已经阅读了这篇文章,我仍然有一个关于析构函数的问题。我知道那篇文章基本上说你不需要处理数据集、数据表和数据视图,但我的数据集是海量的,所以我想尽快释放内存。那么,我的问题是,即使在调用我的对象的dispose方法时将处理数据集,我是否应该包含析构函数?另外,再次向我解释为什么需要“bool disposing”C# 我应该向包含数据集的类添加析构函数/终结器吗?,c#,destructor,dispose,idisposable,C#,Destructor,Dispose,Idisposable,我已经阅读了这篇文章,我仍然有一个关于析构函数的问题。我知道那篇文章基本上说你不需要处理数据集、数据表和数据视图,但我的数据集是海量的,所以我想尽快释放内存。那么,我的问题是,即使在调用我的对象的dispose方法时将处理数据集,我是否应该包含析构函数?另外,再次向我解释为什么需要“bool disposing” public DEditUtil(DataSet dsTxData) { this.dsTxData = dsTxData; }
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);
}
不,这里不需要任何其他方法调用,您所做的已经足够了。
Dispose
将由运行时调用,您将释放分配的资源,清理工作将由GC决定如何以及何时执行
如果你有真正的巨大的内存问题,你可以尝试调用GC.Collect()
来强制收集垃圾,这通常是有效的,但以这种方式使用它从来不是一个好的做法,所以尽量避免它
编辑
根据评论,在您的案例中,注意执行流很重要,因为
数据集
清理将仅在disposed==false
和disposing==true
未处理的情况下执行。否,这里不需要任何其他方法调用,您所做的已经足够了。
Dispose
将由运行时调用,您将释放分配的资源,清理工作将由GC决定如何以及何时执行
如果你有真正的巨大的内存问题,你可以尝试调用GC.Collect()
来强制收集垃圾,这通常是有效的,但以这种方式使用它从来不是一个好的做法,所以尽量避免它
编辑
根据评论,在您的案例中,重要的是要注意执行流,因为
数据集
只有在未disposed==false
和disposing==true
的情况下才会进行清理,只有在从代码进行esplicit调用时才会出现这种情况。只要代码不再引用您的数据集
对象所使用的内存,它就可以用于垃圾收集
垃圾收集器将在稍后(非确定)时间使该内存可供程序使用
这两件事都不取决于是否有析构函数或调用
Dispose
,因此答案是否定的-您不需要析构函数。只要代码不再引用数据集对象所使用的内存,它就可以用于垃圾收集
垃圾收集器将在稍后(非确定)时间使该内存可供程序使用
这两件事都不取决于是否有析构函数或调用
Dispose
,因此答案是否定的-您不需要析构函数。是的,一般来说,只要满足以下任一条件,您就应该实现:
IDisposable
(这意味着它们又有非托管资源)Dispose()
方法的布尔值指示您是从公共Dispose
中调用还是从终结器中调用
如果调用了publicDispose
方法,则该调用堆栈是确定的:直接调用Dispose方法,因此可以安全地调用子对象上的方法(包括Dispose
)
如果您在终结器中,那么您不知道其他也正在被垃圾收集的对象发生了什么。通常,从终结器中调用控件上的托管对象的方法可能不安全
因此,布尔值基本上是这样的:“如果为true,则处理所有内容;如果为false,则仅处理我的非托管资源,并让其他人处理它们的资源。”是的,通常,只要满足以下任一条件,您就应该实现:
IDisposable
(这意味着它们又有非托管资源)Dispose()
方法的布尔值指示您是从公共Dispose
中调用还是从终结器中调用
如果调用了publicDispose
方法,则该调用堆栈是确定的:直接调用Dispose方法,因此可以安全地调用子对象上的方法(包括Dispose
)
如果您在终结器中,那么您不知道其他也正在被垃圾收集的对象发生了什么。通常,从终结器中调用控件上的托管对象的方法可能不安全
因此,布尔值基本上表示:“如果为true,则处理所有内容;如果为false,则仅处理我的非托管资源,并让其他人处理它们的资源。”用户编写的类很少会出于任何目的使用终结器(或C#析构函数),而不是记录调用
dispose
的失败。除非有人深入研究终结器如何工作的细节,以及究竟什么是保证或不保证