C# 我应该向包含数据集的类添加析构函数/终结器吗?

C# 我应该向包含数据集的类添加析构函数/终结器吗?,c#,destructor,dispose,idisposable,C#,Destructor,Dispose,Idisposable,我已经阅读了这篇文章,我仍然有一个关于析构函数的问题。我知道那篇文章基本上说你不需要处理数据集、数据表和数据视图,但我的数据集是海量的,所以我想尽快释放内存。那么,我的问题是,即使在调用我的对象的dispose方法时将处理数据集,我是否应该包含析构函数?另外,再次向我解释为什么需要“bool disposing” public DEditUtil(DataSet dsTxData) { this.dsTxData = dsTxData; }

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

        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
    (这意味着它们又有非托管资源)
  • 终结器(C++/C#称之为“析构函数”的通用CLR术语)的存在是为了处理由于某种原因未调用Dispose方法的情况。传递给受保护的
    Dispose()
    方法的布尔值指示您是从公共
    Dispose
    中调用还是从终结器中调用

    如果调用了public
    Dispose
    方法,则该调用堆栈是确定的:直接调用Dispose方法,因此可以安全地调用子对象上的方法(包括
    Dispose

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


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

    是的,通常,只要满足以下任一条件,您就应该实现:

  • 您的类正在分配非托管资源,或者
  • 您管理的资源实现了
    IDisposable
    (这意味着它们又有非托管资源)
  • 终结器(C++/C#称之为“析构函数”的通用CLR术语)的存在是为了处理由于某种原因未调用Dispose方法的情况。传递给受保护的
    Dispose()
    方法的布尔值指示您是从公共
    Dispose
    中调用还是从终结器中调用

    如果调用了public
    Dispose
    方法,则该调用堆栈是确定的:直接调用Dispose方法,因此可以安全地调用子对象上的方法(包括
    Dispose

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


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

    用户编写的类很少会出于任何目的使用终结器(或C#析构函数),而不是记录调用
    dispose
    的失败。除非有人深入研究终结器如何工作的细节,以及究竟什么是保证或不保证