C#一次性问题

Yip*_*Yay 3 c# garbage-collection idisposable disposable

垃圾收集器是否会自动释放与某些实例关联的非托管资源(实际上是什么)IDisposable,例如,如果我忘记编写using语句?

很显然,我不知道何时会发生这种事,但它是精离开IDisposableGC时候我不关心这些资源,我很好,他们将被安置最终

Eri*_*ert 18

垃圾收集器是否会自动释放与某些IDisposable实例关联的非托管资源(实际上是什么),例如,如果我忘记使用语句编写?

通常,但不一定.一次性资源的作者需要做正确的事情.

显然,我不知道什么时候会发生这种情况,但是当我不关心那些资源时将IDisposable留给GC是没关系的,我很好,他们最终会被处理掉?

你的问题预示着虚假.垃圾收集器永远不会调用Dispose. 相反,垃圾收集器调用析构函数(如果您愿意,则调用"终结器").析构函数可能会或可能不会为健忘的用户调用Dispose.

你的问题也表明态度不好.可能不在乎资源是否被释放,但另一个程序当然可能会关心!如果您的客户正在运行两个试图访问相同的非托管资源的程序,一个由您编写,另一个由其他人编写,该怎么办? 做一个好公民; 一旦完成它们就释放您稀缺的资源,以便其他程序可以使用它们.这就是"使用"的真正目的 - 通过确保快速回收稀缺资源来保持礼貌.

如果用户忘记调用Dispose,则Dispose模式的正确实现将确保析构函数清除非托管资源,并确保析构函数在记住时不清理资源.

如果您是为拥有非托管资源的类编写Dispose实现的人,则您有责任在用户未正确调用Dispose的情况下获取析构函数代码. 编写此代码的正确方法记录得非常好; 根据规律.有关一些有用的链接,请参阅Jon的评论.

还需要注意的是,如果你正在写这样一类,那么您需要也使它在场景中,它是工作不可能为用户调用Dispose.例如,假设构造函数分配了两个非托管资源,并且在第一个和第二个资源的分配之间抛出异常并将其捕获到构造函数之外.然后,用户无法调用Dispose,因为在构造函数成功运行后,新对象引用的赋值发生,并且构造函数从未成功运行.如何释放第一个非托管资源?只有析构函数才能释放它.在这种情况下,析构函数必须是健壮的; 被破坏的对象可能永远不会完全构造,因此您不能依赖构造函数的任何不变量.