C#一次性问题
垃圾收集器是否会自动释放与某些IDisposable实例关联的非托管资源(实际上是什么),例如,如果我忘记使用语句编写?
显然,我不知道什么时候会发生这种情况,但是当我不关心那些资源时将IDisposable留给GC是没关系的,我很好,他们最终会被处理掉? 解决方法
通常,但不一定.一次性资源的作者需要做正确的事情.
你的问题预示着虚假.垃圾收集器永远不会调用Dispose.相反,垃圾收集器调用析构函数(如果您愿意,则调用“终结器”).析构函数可能会或可能不会为健忘的用户调用Dispose. 你的问题也表明态度不好.您可能不在乎资源是否被释放,但另一个程序当然可能会关心!如果您的客户正在运行两个试图访问相同的非托管资源的程序,一个由您编写,另一个由其他人编写,该怎么办?做一个好公民;一旦完成它们就释放您稀缺的资源,以便其他程序可以使用它们.这就是“使用”的真正目的 – 通过确保快速回收稀缺资源来保持礼貌. 如果用户忘记调用Dispose,则Dispose模式的正确实现将确保析构函数清除非托管资源,并确保析构函数在记住时不清理资源. 如果您是为拥有非托管资源的类编写Dispose实现的人,则您有责任在用户未正确调用Dispose的情况下获取析构函数代码.编写此代码的正确方法记录得非常好;根据规律.有关一些有用的链接,请参阅Jon的评论. 另请注意,如果您正在编写此类,那么您还需要在用户无法调用Dispose的场景中使其工作.例如,假设构造函数分配了两个非托管资源,并且在第一个和第二个资源的分配之间抛出异常并将其捕获到构造函数之外.然后,用户无法调用Dispose,因为在构造函数成功运行后,新对象引用的赋值发生,并且构造函数从未成功运行.如何释放第一个非托管资源?只有析构函数才能释放它.在这种情况下,析构函数必须是健壮的;被破坏的对象可能永远不会完全构造,因此您不能依赖构造函数的任何不变量. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |