首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >我是否应该向包含Dataset的类添加析构函数/终结器?

我是否应该向包含Dataset的类添加析构函数/终结器?
EN

Stack Overflow用户
提问于 2012-05-04 14:00:18
回答 4查看 695关注 0票数 1

我已经通读了这篇关于disposing of datasets的文章,但我仍然有一个关于析构函数的问题。我知道这篇文章基本上是说你不需要处理数据集、数据表和数据视图,但我的数据集很大,所以我想尽快释放内存。那么,我的问题是,即使调用对象的dispose方法时dataset将被释放,我是否应该包括析构函数?另外,再次向我解释为什么需要“布尔处理”。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        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);
    }
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-05-04 14:07:36

是的,通常情况下,只要满足以下任一条件,您就应该实现full IDisposable pattern

  1. 您拥有由您的类分配的非托管资源,或者
  2. 您拥有实现IDisposable的托管资源(这意味着它们又拥有非托管资源)

终结器( C++/C#称之为“析构函数”的通用CLR术语)的存在是为了处理由于某种原因而不调用Dispose方法的情况。传递到受保护的Dispose()方法的布尔值,指示是从公共Dispose内部还是从终结器内部调用您。

如果您公共dispose方法被调用,那么调用堆栈就是确定性的:dispose方法是直接调用的,因此您可以安全地调用子对象上的方法(包括Dispose)。

如果您在终结器内部,那么您不知道其他也被垃圾回收的对象发生了什么。通常,从终结器中调用托管对象上的方法可能是不安全的。

因此,布尔值基本上是说:“如果为true,则处置所有资源;如果为false,则仅处置我的非托管资源,并让其他所有人处理他们的资源。”

票数 4
EN

Stack Overflow用户

发布于 2012-05-04 14:07:26

一旦代码不再引用DataSet对象使用的内存,它就可以用于垃圾回收。

垃圾收集器将在稍后(不确定的)时间使该内存对程序可用。

这两件事都不依赖于是否有析构函数或对Dispose的调用,所以答案是否定的-你不需要析构函数。

票数 2
EN

Stack Overflow用户

发布于 2012-05-04 14:05:40

不,你不需要在这里调用任何其他方法,你所做的已经足够了。Dispose将由运行时调用,您将释放分配的资源,清理工作留给GC来决定如何以及何时执行。

如果你真的有内存的巨大问题,你可以尝试调用GC.Collect()来强制垃圾收集,这通常是有效的,但以这种方式使用它从来都不是一个好的做法,所以尽量避免它。

编辑

根据评论,重要的是要注意你的案例中的执行流程,因为如果不是disposed==falsedisposing == trueDataSet清理将只在中完成,而从提供的代码来看,这将是一个案例,只有在代码中进行显式调用时才会执行。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10450369

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文