你如何管理C#中的确定性终结?

时间:2008-10-09 18:13:58

标签: c# garbage-collection

我有一个C#对象,其中一个关键资源需要在非常具体的时间点刷新,这使得它成为一个糟糕的候选者,让垃圾收集器无论什么时候处理它,我应该如何处理它?是否有类似C ++的删除操作符,可以让我在需要时手动终止该对象的实例?

6 个答案:

答案 0 :(得分:21)

您正在寻找IDisposable。这是一个实现此目的的示例类。

class MyDisposableObject : IDisposable
{
   public MyDisposableObject()
   {
   }

   ~MyDisposableObject()
   {
      Dispose(false);
   }

   private bool disposed;
   private void Dispose(bool disposing)
   {
      if (!this.disposed)
      {
          if (disposing)
          {
             // Dispose of your managed resources here.
          }

          // Dispose of your unmanaged resources here.

          this.disposed = true;
       }
   }

   void IDisposable.Dispose()
   {
      Dispose(true);
      GC.SuppressFinalize(this);
   }
}

要使用它,您可以执行以下操作:

public void DoingMyThing()
{
   using (MyDisposableObject obj = new MyDisposableObject())
   {
      // Use obj here.
   }
}

using关键字可确保Dispose()上的IDisposable方法在其范围的末尾被调用。

答案 1 :(得分:2)

这正是IDiposable接口的用途。您在Dispose()方法中释放关键资源,然后将对象留给垃圾处理器来处理释放内存。

答案 2 :(得分:2)

IDisposable接口存在确定性破坏。有一种模式可以在MSDN上正确实现它。

同时,当对象的生命周期不跨越多个范围时,您还应该考虑使用using statement

答案 3 :(得分:0)

Google用于IDisposable界面。这是您可以使用的唯一机制。如果您的关键资源不受管理,那么它就是量身定制的。如果它是一个托管资源,你是否可以更具体地说明需要“刷新”的内容。

答案 4 :(得分:0)

添加了IDisposable接口以支持C ++ / CLI中的确定性销毁,您可以从任何.NET语言中使用它。这就是你想要的。

答案 5 :(得分:0)

如果您正在讨论在特定时间“必须”发布的特定托管资源,则可以在取消引用该对象后特定地调用Garbage Collectors的Collect方法,但是性能考虑因素是通常,垃圾收集器知道何时收集物品。总的来说这是一个坏主意。

正如其他人在上面提到的那样,IDisposable模式有助于在需要时释放非托管资源。

注意:我要重复一遍,你可以调用GC.Collect(),但这不是一件好事,而是问题的有效答案!