是否必须在完成后销毁对象?
本文关键字:对象 是否 | 更新日期: 2023-09-27 17:51:11
在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();
}
}
除非对象实现了IDisposable
接口,否则当您使用完它时,不需要对它做任何操作。
让垃圾回收器完成它的工作,世界上一切都会好起来的。
只有处理非托管资源的对象才需要显式地处置。这些类型应该实现IDisposable接口。处理这些对象的一个好方法是使用using
关键字:
using (SqlConnection conn = new SqlConnection(...))
{
// ...do stuff with conn
} // conn.Dispose() will automatically be called here
通常c#使用垃圾收集器,因此不需要手动"销毁"对象。
在某些情况下,您可能希望立即释放与某些对象相关的资源,如网络/数据库连接,打开的文件等。使用"Using"通常是最好的表达方式。
在c#中,您不需要总是分发,但只在需要时才分发。通常,当您设计一个类时,您将声明并实现一个IDisposable接口,该接口在必要时执行实际的清理工作。需要处理类实例可能分配的可能的非托管资源,重载的Dispose()方法是您应该处理它们并释放它们的最佳位置。
要注意,Dispose()方法应该被设计成可以被多次调用而不会崩溃,因此要密切注意并检查任何对象引用是否为空值。这在您的代码中是一个很好的实践,但是Dispose()方法在这方面需要更多的注意。
如前所述,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清理这个对象的双重工作。