在C#中销毁一个对象

时间:2014-09-10 12:03:35

标签: c# object

如何销毁finally块中的对象。

例如

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

    }
    catch() {

    }
    finally {
        // destroy obj here
    }
 }

2 个答案:

答案 0 :(得分:22)

什么都不做。您的参考(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
}

答案 1 :(得分:6)

首先,C#语言中没有任何名为Destroy的内容。相反,我们称之为Dispose

当一个对象超出范围但是对于非托管资源(如套接字,db调用等)时,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