28
|
mr.b Scott Lystig Fritchie · 技术社区 · 14 年前 |
1
33
在实现Dispose模式时,还可以向调用
要防止Dispose方法运行两次(如果对象已被释放),请添加
|
2
30
垃圾收集 :gc在不再引用对象时回收对象使用的内存。 处置 :IDisposable接口中的一种方法,当程序员调用它时(通过using块直接或间接)释放所有托管和非托管资源。 终结器 :释放所有非托管资源的方法。在回收内存之前由GC调用。
管理资源
:实现
非托管资源 :封装在托管资源类中的填充。Windows句柄是最简单的例子。 现在回答你的问题: GC保留一个所有对象的列表(终结队列),这些对象的类声明一个终结器(C中的~classname)。对象在创建时放入此队列。GC定期运行以检查程序中是否有任何无法访问的对象。然后,它检查是否有任何不可访问的对象从终结队列中被引用,并将这些对象放入另一个称为Freacheable队列的队列中,而其余的对象则被回收。单独的线程用于运行可执行队列中对象的Finalize方法。 下次运行GC时,它将发现先前在可执行队列中的一些对象已经完成,因此可以进行回收。请注意,GC至少需要两个周期(如果要完成大量的定稿工作,则需要更多周期)来使用定稿器除去对象,这会导致一些性能损失。
这个
也就是说,很少需要编写终结器,因为对于大多数常见的非托管资源,托管包装已经存在,并且托管资源将通过调用它们的
进一步阅读 : |
3
6
可在第一次GC运行后完成的对象。 通常,当GC检测到一个对象不可访问时,它会回收它。如果对象是可终结的,那么GC不会回收它;相反,它认为它仍然是可到达的(以及此对象引用的所有对象,等等),并安排它进行终结。只有在找到对象时才会回收该对象 再一次 在最终确定之后的某个时刻无法到达。 这意味着一个可完成的对象会产生额外的成本:该对象必须在内存中保留更长的时间。因此,您看到的调用是:当不需要终结时,禁止它是值得的。在这里,对象使用终结来确保在某个点上始终“释放”它。当它被显式处理时,就不需要再进行定稿。 |
4
2
如果类型实现终结器(
|
5
0
来自MSDN: GC.SuppressFinalize :
通常,如果对象不引用其他对象,只引用离散类型,或者已经将任何对象引用重置为空,则可以使用此方法。 |
Robert King · Unity C#语法问题-转换位置 1 年前 |
JBryanB · 如何从基本抽象类访问类属性 1 年前 |
law · 检查答案按钮的输入字符串格式不正确 2 年前 |
i_sniff_ket · 在unity之外使用unity类 2 年前 |