【问题标题】:Do I have to destroy an object once I am done?完成后是否必须销毁对象?
【发布时间】:2012-12-23 21:23:42
【问题描述】:

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

【问题讨论】:

  • 这是什么例子?

标签: c# class object destructor


【解决方案1】:

除非该对象实现了IDisposable 接口,否则当您使用完毕后,您无需对它进行任何操作。

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 我如何知道我是否有“处理非托管内存的对象”
    • @JohnRyann 最大的线索是他们何时实现 IDisposable。
    • 对于 MS 的 API,您将在类的语法中看到此声明。以 [msdn.microsoft.com/en-us/library/… 为例,您会看到 public class SPSite : IDisposable
    • @John Ryann 一个很好的线索是当您使用 pinvokes 并经常作为 IntPtr 值获取句柄时。当你处理这些事情时,你应该明确地释放它们。
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

        如前所述,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,它会导致double work GC 清理此对象。

        【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-05-12
        • 2015-09-06
        • 1970-01-01
        • 2018-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-13
        • 1970-01-01
        相关资源
        最近更新 更多