是否必须在完成后销毁对象?

本文关键字:对象 是否 | 更新日期: 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清理这个对象的双重工作。