我已经阅读了有关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/

10-16 04:43