【问题标题】:Destroy an object in C#在 C# 中销毁一个对象
【发布时间】:2020-06-19 01:03:37
【问题描述】:

如何在 finally 块中销毁对象。

例如

 Public void fnName()
 {
    ClassName obj = new ClassName();
    try {

    }
    catch() {

    }
    finally {
        // destroy obj here
    }
 }

【问题讨论】:

  • obj = null;应该够了……
  • 如果对象的Class实现了IDisposable,可以调用obj.Dispose()。
  • @FarhadJabiyev obj = null 如果变量 obj 是在函数范围内定义的(因为引用存在于堆栈中),那么它是非常没用的。您是否正在尝试清理资源?
  • 好吧,因为它是一个局部变量,所以您实际上不必执行obj=null;。如果它没有被其他任何地方引用,垃圾收集器会处理它。
  • 正如 vesan 所说,让垃圾收集器来处理它。除非你的班级实现了IDisposable,否则别担心

标签: c# object


【解决方案1】:

什么都不做。您的参考 (obj) 将超出范围。然后垃圾收集器会出现并销毁您的对象。

如果有(非托管)资源需要立即销毁,则实现 IDisposable 接口并在 finalize 块中调用 Dispose。或者更好的是,使用 using 语句。

编辑

根据 cmets 的建议,当您的 ClassName 实现 IDisposable 时,您可以这样做:

ClassName obj = null;
try{
   obj = new ClassName();
   //do stuff
}
finally{
   if (obj != null) { obj.Dispose(); }
}

或者,使用 using 语句:

using (var obj = new ClassName())
{
     // do stuff
}

【讨论】:

  • 显示他的代码,但重写为使用using 可能会有所帮助。
【解决方案2】:

首先,在 C# 语言中没有名为 Destroy 的东西。相反,我们调用Dispose

Garbage Collector 会在对象超出范围时自动执行清理过程,但对于套接字、数据库调用等非托管资源,您需要Dispose 对象,如下所示:

Public void fnName()
{
    ClassName obj=new ClassName();
    try
    {

    }
    catch()
    {

    }
    finally
    {
       obj.Dispose();
    }
}

...并在您的类中实现Dispose 功能,如下所示:

      /// <summary>
      /// Dispose all used resources.
      /// </summary>
      public void Dispose()
      {
          this.Dispose(true);
          GC.SuppressFinalize(this);
      }

        /// <summary>
        /// Dispose all used resources.
        /// </summary>
        /// <param name="disposing">Indicates the source call to dispose.</param>
        private void Dispose(bool disposing)
        {
            if (this.disposed)
            {
                return;
            }

            if (disposing)
            {
                ////Number of instance you want to dispose
            }
        }

另一种阻碍对象生命周期的方法是在using 块中编写代码,如下所示:

using(var obj = new ClassName())
{
}

更多使用方法请查看here

【讨论】:

  • 我不是投反对票的人,但我不得不问这个......你能证明你为什么需要调用 GC.SuppressFinalize(this); 吗?
  • "C#" 无法进行任何清理; .NET Framework 和垃圾收集器确实如此。 “C#”只是一种编程语言。
猜你喜欢
  • 1970-01-01
  • 2011-09-18
  • 2023-02-08
  • 1970-01-01
  • 2017-06-29
  • 2012-02-06
  • 2010-12-31
  • 1970-01-01
相关资源
最近更新 更多