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

10

我有一个C#对象,其中包含关键资源,需要在非常特定的时间点进行刷新,因此不能留给垃圾回收程序自己处理。请问应该如何处理?是否有类似于C++的delete运算符,让我可以在需要时手动销毁该对象实例?

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 关键字确保 IDisposable 上的 Dispose() 方法在其作用域结束时被调用。


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

2
IDisposable接口用于确定性销毁。在MSDN上有一个正确实现它的模式。
同时,当您的对象生命周期不跨越多个作用域时,您还应考虑使用using语句

0

搜索IDisposable接口。这是您唯一可用的机制。如果您的关键资源是非托管的,则此接口非常适合您。如果它是托管资源,请具体说明需要“清除”什么。


0

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


0

如果您正在谈论一个特定的托管资源,您感觉它“必须”在特定时间释放,那么您可以在取消引用对象后专门调用垃圾回收器的Collect方法,但需要考虑性能问题,因为通常垃圾回收器知道何时收集项目。总的来说,这是一个不好的想法。

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

注意:我要重申,您可以调用GC.Collect(),但这不是一件好事,但对于这个问题来说是一个有效的答案!


1
不要调用GC.Collect()。这是一个不好的习惯,通常会带来更多的负面影响而不是好处。 - user1228
我知道那个...因此我写了一条关于不使用它的注释。 - Mitchel Sellers

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接