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();
    }
}
4

5 回答 5

11

除非对象实现了IDisposable接口,否则当您使用完它时,您无需对它做任何事情。

让垃圾收集器完成它的工作,世界上一切都会好起来的。

于 2013-01-09T16:34:38.910 回答
5

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

using (SqlConnection conn = new SqlConnection(...))
{
    // ...do stuff with conn
}  // conn.Dispose() will automatically be called here
于 2013-01-09T16:36:22.833 回答
2

通常 C# 使用垃圾收集器,因此无需手动“破坏”对象。

在某些情况下,您可能希望立即释放与某些对象关联的资源,例如网络/数据库连接、打开的文件等。使用“使用”通常是最好的方法。

于 2013-01-09T16:36:34.210 回答
0

如前所述GC,C# 中有清理对象的功能。

中没有析构函数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 清理此对象的双重工作

于 2013-01-09T16:52:24.377 回答
0

在 C# 中,您不需要总是破坏,但仅在需要时才需要破坏。通常,当您设计一个类时,您将声明并实现一个IDisposable接口,该接口在必要时进行实际清理。您需要处理类实例可能分配的非托管资源,重载的Dispose()方法是您应该处理它们并取消分配它们的最佳位置。

请注意,Dispose()方法的设计应使其可以多次调用而不会崩溃,因此请密切注意并检查任何对 null 值的对象引用。这是整个代码中的一个好习惯,但 Dispose() 方法需要对此给予更多关注。

于 2013-01-09T16:48:53.973 回答