在C#中销毁一个对象

12

如何在finally块中销毁一个对象。

例如

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

    }
    catch() {

    }
    finally {
        // destroy obj here
    }
 }

obj = null; 应该足够了…… - Mo Patel
3
如果对象的类实现了IDisposable接口,你可以调用obj.Dispose()方法。 - WeSt
@FarhadJabiyev 如果变量obj在函数作用域内定义(因为引用存在于堆栈上),那么obj = null就没什么用了。您是想清理资源吗? - Bas
8
既然这是一个局部变量,你其实不需要做 obj=null;。如果它没有被其他地方引用,垃圾回收器会处理它。 - vesan
3
正如vesan所说,让垃圾收集器处理它。除非您的类实现了IDisposable,否则不必担心它。 - Sayse
为了让任何人能够很好地回答你的问题,你需要解释为什么你觉得在程序员指定的时间点发生某种形式的最终化是很重要的。 - David Heffernan
2个回答

34

什么都不需要做。您的引用(obj)将超出范围。然后垃圾收集器会删除您的对象。

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

编辑

如评论中所建议的,当您的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 可能会有帮助。 - hatchet - done with SOverflow

8
首先,C#语言中没有名为Destroy的内容。相反,我们称之为Dispose
当对象超出范围时,垃圾回收器会自动执行清理程序,但对于像套接字、数据库调用等非托管资源,您需要像下面这样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())
{
}

For more details for using check it here


1
我不是那个点了踩的人,但我必须问一下......你能解释一下为什么需要调用GC.SuppressFinalize(this)吗? - Mo Patel
"C#" 无法进行任何清理工作; .NET Framework 和垃圾回收器会进行清理。 "C#" 只是一种编程语言。 - Uwe Keim

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