【问题标题】:.NET garbage collector.NET 垃圾收集器
【发布时间】:2010-07-01 11:52:35
【问题描述】:

链接写在http://msdn.microsoft.com/en-us/magazine/bb985010.aspx

“当应用程序创建新对象时,new 运算符从堆中分配内存。如果对象的类型包含 Finalize 方法,则指向该对象的指针被放置在终结队列中。”

谁能帮我解释一下

1) 这意味着,只有当我们显式使用 finalize(使用析构函数)时,对象才会进入 finalize 队列。

2) 每个 .NET 类都隐式使用 finalize(使用析构函数),因此所有 .net 类库对象都将进入 finalize 队列。

3)我们的自定义类怎么样 A类 { } 类 A obj 是否会完成,同时考虑两种情况(显式/隐式析构函数)

4) 如果上面的类是用非托管代码编写的,会发生什么。它是否会进入finalize queue

谢谢

【问题讨论】:

    标签: .net garbage-collection


    【解决方案1】:

    1) 是的,实现 Finalize() 方法的对象(C# 中的“析构函数”)被添加到 finalize-queue。

    2) 不,大多数 .NET 类没有终结器。当您没有在您的类中实现一个时,该类的实例将不会添加到 finalize 队列中。

    3) 你的 A 类只有在实现为 Finalize-Method 时才会进入 finalize-queue。 (C#中的“析构函数”

    4) 非托管类不受管理。不会被垃圾收集,也不会添加到 finalize-queue。

    一些一般性说明。

    • C# 中的“析构函数”不是 C++ 意义上的析构函数。当它被调用时,你没有被授予者等等。它是编写终结器方法的语法糖。
    • 避免使用终结器,因为它们会增加额外的开销。首先,必须将对象添加到 finalize 队列中。然后它必须被垃圾收集两次。第一次发现已经不用了。终结器方法完成的第二次。
    • 使用 IDisposable 接口管理和释放资源。尤其是原生资源。
    • 仅使用终结器,用于“紧急清理”本机资源。基本上,您检查对象是否正确处置(IDisposable)-interace。如果没有,您在终结器中执行该工作以防止进一步的资源泄漏。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-15
      • 1970-01-01
      • 2016-11-18
      • 2011-06-16
      相关资源
      最近更新 更多