我完成后是否需要销毁一个对象?

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
5个回答

11

除非对象实现了IDisposable接口,否则在使用完成后就不需要对其进行任何操作。

让垃圾收集器自己处理,一切都会很好。


5

只有涉及非托管资源的对象需要显式释放。这些类型应该实现IDisposable接口。一个处理这些对象的好方法是使用using关键字:

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

我如何知道我是否有“处理非托管内存的对象”? - John Ryann
3
最重要的线索就是当它们实现IDisposable接口时。 - asawyer
对于微软的API,您将在类的语法中看到此声明。例如,请查看http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.spsite.aspx,您将看到public class SPSite:IDisposable - Reacher Gilt
@John Ryann 一个好的线索是当您使用 pinvoke 并经常作为 IntPtr 值获取句柄时。当您处理这些内容时,应明确释放它们。 - Adi

2
一般情况下,C#使用垃圾回收器,因此不需要手动“销毁”对象。
在某些情况下,您可能希望立即释放与某些对象相关联的资源,例如网络/数据库连接、打开文件等。使用'using'通常是最好的方法。

0
在C#中,你不需要总是销毁always,只需要在需要时进行销毁。 通常情况下,在设计类时,你会声明并实现一个IDisposable接口,如果必要的话,它会进行实际的清理。你需要注意可能分配给类实例的非托管资源,并且过载的Dispose()方法是你应该处理它们并释放它们的最佳位置。
要小心,Dispose()方法应该被设计为可以被多次调用而不会崩溃,因此要密切注意并检查任何对象引用是否为null值。这是你代码中的一个好的实践方法,但是Dispose()方法需要更多关注。

0

正如提到的那样,C#中有GC来清理对象。

C#中没有析构函数,但是当对象被回收时会调用finalizer。但在大多数情况下,不需要实现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为清理该对象而进行双倍工作


C# 中确实有析构函数:http://msdn.microsoft.com/zh-cn/library/66x5fx1b(v=vs.80).aspx - Sebastian Negraszus
抱歉,我在术语上犯了一个错误。 - Alexander Balte

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接