在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();
}
}
答案 0 :(得分:11)
除非该对象实现了IDisposable
界面,否则当您使用它时,您无需对其进行任何操作。
让垃圾收集器完成它的工作,一切都将在世界上做得很好。
答案 1 :(得分:5)
只需要明确处理处理非托管资源的对象。这些类型应该实现IDisposable接口。处理这些对象的好方法是使用using
关键字:
using (SqlConnection conn = new SqlConnection(...))
{
// ...do stuff with conn
} // conn.Dispose() will automatically be called here
答案 2 :(得分:2)
通常,C#使用垃圾收集器,因此无需手动“破坏”对象。
在某些情况下,您可能希望立即释放与某些对象关联的资源,例如网络/数据库连接,打开文件等。使用“使用”通常是最好的方法。
答案 3 :(得分:0)
在C#中,您无需彻底销毁 ,但仅限于需要时。 通常,当您设计一个类时,您将声明并实现一个IDisposable接口,以便在必要时进行实际清理。您 需要 来处理您的类实例可能分配的可能的非托管资源,并且重载的Dispose()方法是您应该处理它们并解除分配的最佳位置它们。
要小心,Dispose()方法应该是设计的,这样可以多次调用它而不会崩溃,所以要特别注意并检查任何obect引用是否为null值。这是一个很好的实践,但是Dispose()方法需要更多关注。
答案 4 :(得分:0)
如上所述,C#中有GC
来清理对象。
C#
中没有析构函数,但在收集对象时会调用finalizer
。但是在大多数情况下都没有必要实现终结器。
有关Finalize方法的一些信息: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
注意实现Finalize,它会导致GC double work清除此对象。