9

我有一个 C# 对象,它的关键资源需要在非常特定的时间点刷新,这使得它不适合让垃圾收集器随时处理它,我应该如何处理这个问题?是否有类似 C++ 的 delete 运算符之类的东西可以让我在需要时手动终止该对象的实例?

4

6 回答 6

22

您正在寻找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()方法 on在其IDisposable作用域结束时被调用。

于 2008-10-09T18:30:06.510 回答
2

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

于 2008-10-09T18:18:05.550 回答
2

IDisposable 接口用于确定性销毁。在MSDN上有一个正确实现它的模式。

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

于 2008-10-09T18:23:34.790 回答
0

谷歌的 IDisposable 接口。这是您唯一可用的机制。如果您的关键资源不受管理,它是量身定制的。如果它是托管资源,您能否更具体地说明需要“刷新”的内容。

于 2008-10-09T18:19:11.023 回答
0

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

于 2008-10-09T18:20:11.613 回答
0

如果您谈论的是您认为“必须”在特定时间释放的特定托管资源,则可以在取消引用对象后专门调用垃圾收集器的收集方法,但需要考虑性能注意事项,通常垃圾收集器知道何时收集项目。总的来说,这是一个坏主意。

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

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

于 2008-10-09T18:20:39.913 回答