代码之家  ›  专栏  ›  技术社区  ›  Marko

C#析构函数的示例使用

  •  4
  • Marko  · 技术社区  · 14 年前

    我读到了C语言中的析构函数,但找不到合适的用例。

    有人能提供一个使用的例子和解释吗?

    非常非常感谢。

    更新
    本书中的代码示例实现了一个Desctuctor和一个Dispose()方法,请参阅本书中的代码片段。

    class MyClass
    {
        bool disposed = false; // Disposal status
        public void Dispose()
        {
            Dispose(true);
            GC.SuppressFinalize(this);
        }
        ~MyClass()
        {
            Dispose(false);
        }
        protected virtual void Dispose(bool disposing)
        {
            if (disposed == false)
            {
                if (disposing == true)
                {
                    // Dispose the managed resources. Factored Dispose
    
                }
                // Dispose the unmanaged resources.
    
            }
            disposed = true;
        }
    }
    

    马尔科

    6 回复  |  直到 14 年前
        1
  •  8
  •   Jon Skeet    14 年前

    终结器是 非常 现在很少需要。他们 习惯于 在直接访问本机资源时是必需的,但现在通常应该使用 SafeHandle 相反。

    乔·达菲有一个 excellent post about this 其中涉及的细节比我自己写的还多,所以去读吧:)

    关于术语的简要说明:C#规范的ECMA版本将它们称为终结器;规范的Microsoft版本始终将它们称为析构函数并继续这样做。

        2
  •  2
  •   Puppy    14 年前

    它们是终结器,不是析构函数。它们通常用于清理非托管资源-如果您编写了自己的文件类,则需要使用终结器清理本机文件句柄。

        3
  •  1
  •   Mark Byers    14 年前

    C中很少需要终结器,添加终结器可能会导致垃圾回收器花费较长时间来清理垃圾,因为运行终结器需要额外的过程。相反,您通常应该使用IDisposable模式。

    终结器的一个示例用法是,如果怀疑资源泄漏,可以在调试时使用它来检查 Dispose 在垃圾回收对象之前已正确调用。如果持有非托管资源的对象在调用Dispose之前调用了终结器,则可能是资源泄漏的迹象。但由于终结器可能永远不会被调用,因此它不应包含任何应用程序关键逻辑。

        4
  •  1
  •   CodesInChaos    14 年前

    你什么意思 destructor ? C#有

    • 这个 IDisposable 用于确定性破坏的模式
      当您不再需要手柄时,关闭手柄非常有用。所以他们关门了 现在 并且不会在GC决定收集对象的时候,而对象可能会晚很多或者根本不会。
      或者在纯托管代码中告诉对象从对象图中删除自身,取消订阅事件,。。。
      常用于 using 陈述
    • 几乎没用的定稿器。它运行在一个未知的时间,它可能根本不运行,。。。
      我用它做的唯一用途就是提醒我忘记调用Dispose
      虽然它具有C++析构函数的语法,但我并不认为它是C++析构函数的等价物。我更愿意考虑 Dispose() 作为毁灭者。
    • Critical finalization SafeHandle s 用于本机资源

    我认为你发布的现代代码应该拥有一个私有的安全句柄,并称之为 Dispose 方法自行处理。

        5
  •  0
  •   n8wrl    14 年前

    C没有“析构函数”,因为你可能在想它们。使用.NET的垃圾收集器,当类超出作用域时,对象收集不会立即发生。

    我想你更感兴趣的是IDisposable模式。这是清理对象使用的资源的确定方法。

    此外,.NET类可以有“终结器”,在收集对象时执行。如果忽略了对象的原始调用方,则可以使用它来调用dispose。

    但是,在类中实现终结器会将其排队以进行GC的特殊处理,并且可能会对性能产生影响。

        6
  •  0
  •   Will Marcouiller    14 年前

    这个 IDisposable 接口提供了一个用作析构函数/终结器的方法。

    我的意思是你可以实现 IDisposable公司 接口以释放对象正在使用的资源。正如其他人所说,这和一个好的旧析构函数不是一回事,因为 Dispose() 方法不会由您自己直接调用,而是由托管代码在一段时间后处理您的对象。