【问题标题】:How do you manage deterministic finalization in C#?如何在 C# 中管理确定性终结?
【发布时间】:2010-09-16 08:27:00
【问题描述】:

我有一个 C# 对象,它的关键资源需要在非常特定的时间点刷新,这使得它不适合让垃圾收集器随时处理它,我应该如何处理这个问题?有没有像 C++ 的删除操作符这样的东西,可以让我在需要时手动杀死这个对象的实例?

【问题讨论】:

    标签: c# garbage-collection


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

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

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

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

          【讨论】:

          • 不要调用 GC.Collect()。养成的坏习惯,通常弊大于利。
          • 我知道...所以我要注意不使用它。
          【解决方案5】:

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

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

          【讨论】:

            【解决方案6】:

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2021-10-14
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-07-18
              • 2019-06-11
              • 1970-01-01
              • 2017-01-08
              相关资源
              最近更新 更多