如何销毁finally块中的对象。
例如
Public void fnName()
{
ClassName obj = new ClassName();
try {
}
catch() {
}
finally {
// destroy obj here
}
}
答案 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