一旦完成,我是否必须销毁一个物体?

时间:2013-01-09 16:33:17

标签: c# class object destructor

在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 个答案:

答案 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清除此对象。