【问题标题】:What is the importance of clearing the collection before disposing在处置前清理收藏品的重要性是什么
【发布时间】:2016-09-20 05:02:08
【问题描述】:

以下代码有什么区别

代码 1:

if(RecordCollections!=null){
   RecordCollections.Clear();
   RecordCollections=null;
}

代码 2:

RecordCollections = null;

代码存在于 Dispose 方法中,在将 Collection 设置为 null 之前使用 Clear 方法有什么优势吗?是否完全需要?

【问题讨论】:

  • @Dev.Joel:您的链接问题涉及一个类,该类将在调用其 Reset() 方法后继续使用(首先,类中的一个可疑功能,因为假设一个合理的实现对于这种方法,只需分配一个新实例即可完成相同的任务)。在这里,OP 正在询问正在处理的对象;因为按照惯例,一旦调用了 Dispose() 方法,对象就不应该可用,因此可以安全地假设正在处理的对象实际上不会再次使用,因此其他答案中提到的(边际)好处不会申请。

标签: c# collections memory-leaks dispose


【解决方案1】:

在使 Collection 为空之前使用 Clear 方法有什么好处吗?

没有一个好的Minimal, Complete, and Verifiable code example是不可能的。

也就是说,这些代码 sn-ps 对我来说都不是很有用。如果Clear() 方法所做的只是清空集合,那么第一个肯定是毫无意义的。当然,如果它真的通过了,例如在每个集合成员上调用Dispose(),那会有所不同。但这将是一个非常不寻常的集合实现。

即使是第二个也没有什么价值,并且与正常的IDisposable 语义相反。 IDisposable 应该只是用于管理非托管资源。它有时会用于其他事情,但这是它的主要目的。特别是,通常只在丢弃对象之前调用Dispose()。如果对象本身将被丢弃,那么它对其他对象(例如集合)的任何引用都将不再可访问,因此将它们设置为 null 不会产生任何有用的效果。

事实上,在某些情况下,将变量设置为null 实际上可以延长对象的生命周期。运行时足够复杂,可以识别不再使用的变量,并且如果它持有对对象的最后一个剩余引用,则该对象可以在此时有资格进行垃圾回收,即使变量的范围进一步扩展。通过将变量设置为null,该变量本身将在程序的后期使用,因此运行时不能将其视为不可访问,直到该点,比它本来的晚。

最后一点通常最常适用于局部变量,而不是对象中的字段。但理论上运行时可以进行更广泛的优化。养成一个坏习惯,到处设置 null 变量,这些变量本身不会存在太久。

【讨论】:

    【解决方案2】:

    Dispose 指的是一种显式清理un-managed memory 的机制,因为使用标准Garbage Collector 无法清理它,大多数IDisposable 将由类实现,它在内部使用非托管API,如@ 987654325@。

    标准做法是:

    • 同时实现 Finalizer,因为 Dispose 是一个显式调用,如果调用者错过了,那么 Finalization 会负责清理操作,尽管它需要 2 个 GC 周期。

    • 1234563 /li>

    关于提供的代码:

    if(RecordCollections!=null){
       RecordCollections.Clear();
       RecordCollections=null;
    }
    

    或者

    RecordCollections = null;
    

    由于这与清理托管内存有关,它几乎没有什么用处,因为 GC 完成了主要工作并且不需要它,但在我看来,它是一个 acceptable practice,其中类变量被显式无效,这使得用户每次分配都不同,并且大多数情况下应尝试使用方法局部变量,直到并且除非需要在方法调用之间共享状态。对象分配滥用,可以得到更多控制。

    就差异而言,虽然一个集合被显式清除然后无效或只是无效,但内存保持不变,直到调用GC,即un-deterministic,但在我看来它不是很很清楚,GC 是如何显式映射对象以供收集的,这些对象不再可达,但是对于各个代,尤其是更高的代(提升对象),如果一个对象被显式标记为null,那么 GC 可能有花费更少/没有时间跟踪根/引用,但是没有明确的文档来解释这个方面/实现。

    【讨论】:

      猜你喜欢
      • 2010-10-29
      • 1970-01-01
      • 1970-01-01
      • 2021-04-22
      • 1970-01-01
      • 2014-08-25
      • 2017-12-13
      • 2016-09-21
      • 2017-02-02
      相关资源
      最近更新 更多