Terminator和IDisposable根据文档(MSDN:链接),很明显在实现终结器时应该使用IDisposable模式。但是如果你实现了IDisposable(为了提供一种确定的对象处理方式),你是否需要实现一个终结器?并且您没有任何非托管资源需要清理?在我看来,如果类只有托管资源,如果你不调用Dispose,那么托管资源会被GC自动清理,所以没有必要实现finalizers。我错了吗?另外,如果我使用我的Dispose方法来清理事件处理程序怎么办?由于GC不会自动调用Dispose,我是否应该实施Finalizer,以确保事件处理程序是无线连接的?不,如果您有一个实现IDisposable的类(即,如果您已正确实现该模式并且您只有要处理的托管资源),则不需要实现终结器。(如果你这样做,它实际上会影响对象的生命周期,因为带有终结器的对象会被添加到GC的终结队列中,并且可能花费比他们需要的更长的时间-如果对象很大,这可能是一个问题一个问题。)除非你有非托管资源,否则你不应该添加终结器。拥有托管一次性资源但不拥有非托管资源的类应该实现完整的Dispose模式,但没有终结器。如果该类未密封,则应在其Dispose()方法中调用GC.SuppressFinalize(this),以防继承类添加终结器。不,你是对的,如果你的对象持有一个拥有非托管资源的对象,那么你应该实现IDisposable,这样你就可以在你的Dispose上调用它的Dispose,但你不需要终结器,因为它的终结器会处理这个。事实上,尝试对Terminator中的final成员做任何事情都充满了这样一个事实,即Terminator将执行的命令不是确定性的,因此如果您尝试这样做,您可能会遇到一些讨厌的错误。通常让一个类拥有1个或0个非托管资源要好得多。如果它有1个非托管资源,它应该有处理它所需的其他状态(即没有其他一次性成员)。SafeHandle是解决这个问题的好方法。如果一个类需要处理多个非托管资源,它应该通过这些处理程序类来处理所述资源。然后终结器和IDisposable变得容易;要么你有唯一的非托管资源来处理(如果调用处理会取消终结器),要么你只需要IDisposable。因为必须直接处理非托管资源的情况相对较少,所以您可能永远不必编写终结器(我想我已经在实际代码中这样做过一次)。整个Dispose(bool)事情也是不必要的,因为敏感的事情在处理非托管资源的类中没有做太多其他事情。如果您只有托管资源,则根本不需要实施IDisposable。IDisposable用于清理GC域之外的东西,比如原生句柄、数据库连接等。如果你的控件包含实现了IDisposable的控件并且它们必须释放原生资源,那么你仍然需要实现IDisposable模式并给你的孩子控制处置的机会。在终结器中调用Dispose()的原因是作为最后的手段,如果对象没有被正确处置,GC将作为最后的手段来执行。是的,如果您只有托管资源,那么当垃圾收集发生时,GC将清理它们(并且您没有任何指向它们的活动引用)但是为什么在这种情况下需要在类型上实现IDisposable?我的意思是,你似乎认为在你的情况下,不处理你的对象不是一个大问题,那么为什么有人要处理它们呢?您还应该意识到,使用终结器时垃圾回收存在性能问题:任何带有终结器的对象都将逃脱第一次GC传递,如果这些对象的生命周期很短,这将大大降低GC效率。在第一次垃圾回收期间,应该清理对象,但不会执行终结器。即使该对象已经被清理,该对象也将被视为长期存在的GC。我从来不需要实现终结器。如您所知,它让对象有机会在GC之前做任何它需要做的事情。应在dispose方法中释放所有资源。以上就是C#学习教程:Terminator和IDisposable分享的全部内容。代表立场,如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
