2013-01-09 17 views
3

在C#中,我必须要总是一旦我完成它就销毁一个对象吗?如果没有,我必须在什么条件下销毁对象并调用析构函数?如果我不摧毁物体会发生什么?优缺点都有什么?我完成后是否必须摧毁一个物体?

简单的例子:

Help h = new Help(); 

h.program_name = "myprogram.exe"; 
h.release_date = "01/10/2013"; 
h.version_number = "1.2.0.0"; 

if (args.Length > 0) 
{ 
    if ((args[0] == "-help") || (args[0] == "-version")||(args[0] == "/?")) 
    { 
     h.writeline(); 
    } 
} 
+5

这是一个什么样的例子? – Rotem

回答

11

除非对象实现了IDisposable接口,就没有必要当你用它做了,你用它做任何事情。

让垃圾收集者做好自己的工作,一切都会在世界上顺利。

5

只有处理非托管资源的对象需要明确处置。这些类型应该实现IDisposable接口。对付这些对象的一个​​好方法是使用using关键字:

using (SqlConnection conn = new SqlConnection(...)) 
{ 
    // ...do stuff with conn 
} // conn.Dispose() will automatically be called here 
+0

如何知道我是否有“处理非托管内存的对象” –

+3

@JohnRyann最大的线索是当他们实现IDisposable时。 – asawyer

+0

对于MS的API,您将在该类的语法中看到此声明。看看[http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.spsite.aspx](SPSite)例如,你会看到'公共类SPSite:IDisposable'。 –

2

一般C#中使用垃圾收集,所以无需手动“破坏”的对象。

在某些情况下,您可能需要立即释放与某些对象相关的资源,例如网络/数据库连接,打开的文件等。使用'using'通常是最好的方法。

0

在C#中,你不需要破坏总是,但只有在需要时。 通常当你设计一个课程时,你将声明和实现一个接口,如果需要的话可以进行实际的清理。您需要需要负责照顾您的类实例可能分配的可能非托管资源,并且重载的Dispose()方法是您应该照顾并释放它们的最佳位置。

要小心,Dispose()方法应该designes,以便它可以被多次调用没有崩溃,所以要密切关注和核对空值的任何obect参考。这是遍及你的代码的一个好习惯,但Dispose()方法需要更多的关注。

0

如前所述,在C#中有GC来清理对象。

C#中没有析构函数,但有finalizer在收集对象时被调用。但是在大多数情况下不需要实现终结器。

约定案方法的一些信息:http://msdn.microsoft.com/en-us/library/system.object.finalize.aspx

如果我们需要对物体配置特定行为(例如清理非托管资源),你应该实现Finalize方法。

这是你的方式如何能做到这一点: http://msdn.microsoft.com/en-us/library/vstudio/b1yfkh5e(v=vs.100).aspx

当心实现最终确定,它会导致double work为GC清理这个对象。

+0

在C#中有**析构函数:http://msdn.microsoft.com/en-us/library/66x5fx1b%28v=vs.80%29.aspx –

+0

对不起,我犯了一个术语错误。 –

相关问题