标准模式是您的基类实现IDisposable和非虚拟Dispose()方法,并实现虚拟Dispose(bool)方法,其中包含可支配资源的类必须覆盖.他们应该总是调用他们的基础Dispose(bool)方法,它最终将链接到层次结构中的顶级类.只会调用覆盖它的那些类,因此链通常很短.
终结者,拼写~C#中的类:不要.很少有类需要一个,并且很容易意外地保留大对象图,因为终结器在释放内存之前至少需要两个集合.在对象不再被引用之后的第一个集合上,它被放置在要运行的终结器队列中.这些是在一个单独的专用线程上运行的它只运行终结器(如果它被阻止,不再运行终结器并且你的内存使用量会爆炸).终结器运行后,收集适当生成的下一个集合将释放该对象及其引用的任何其他未引用的内容.不幸的是,因为它在第一次收集中存活下来,所以它将被放置在较不经常收集的老一代中.出于这个原因,你应该尽早和经常处理.
通常,您应该实现一个小资源包装器类,它只管理资源生命周期并在该类上实现终结器,以及IDisposable.然后,类的用户应该在处理时调用Dispose.不应该有用户的反向链接.这样,只有实际需要终结的东西才会终结于终结队列.
如果您将在层次结构中的任何位置需要它们,则实现IDisposable的基类应实现终结器并调用Dispose(bool),并将false作为参数传递.
Windows Mobile开发人员的警告(VS2005和2008,.NET Compact Framework 2.0和3.5):您放入设计器界面的许多非控件,例如菜单栏,计时器,HardwareButtons,派生自System.ComponentModel.Component,它实现了终结.对于桌面项目,Visual Studio将组件添加到名为System.ComponentModel.Container components
,它在窗体Disposed时生成Dispose代码 - 它依次释放已添加的所有组件.对于移动项目,将components
生成Dispose代码,但将组件放到曲面上不会生成要添加的代码components
.在调用InitializeComponent之后,您必须在构造函数中自己完成此操作.
标准模式是您的基类实现IDisposable和非虚拟Dispose()方法,并实现虚拟Dispose(bool)方法,其中包含可支配资源的类必须覆盖.他们应该总是调用他们的基础Dispose(bool)方法,它最终将链接到层次结构中的顶级类.只会调用覆盖它的那些类,因此链通常很短.
终结者,拼写~C#中的类:不要.很少有类需要一个,并且很容易意外地保留大对象图,因为终结器在释放内存之前至少需要两个集合.在对象不再被引用之后的第一个集合上,它被放置在要运行的终结器队列中.这些是在一个单独的专用线程上运行的它只运行终结器(如果它被阻止,不再运行终结器并且你的内存使用量会爆炸).终结器运行后,收集适当生成的下一个集合将释放该对象及其引用的任何其他未引用的内容.不幸的是,因为它在第一次收集中存活下来,所以它将被放置在较不经常收集的老一代中.出于这个原因,你应该尽早和经常处理.
通常,您应该实现一个小资源包装器类,它只管理资源生命周期并在该类上实现终结器,以及IDisposable.然后,类的用户应该在处理时调用Dispose.不应该有用户的反向链接.这样,只有实际需要终结的东西才会终结于终结队列.
如果您将在层次结构中的任何位置需要它们,则实现IDisposable的基类应实现终结器并调用Dispose(bool),并将false作为参数传递.
Windows Mobile开发人员的警告(VS2005和2008,.NET Compact Framework 2.0和3.5):您放入设计器界面的许多非控件,例如菜单栏,计时器,HardwareButtons,派生自System.ComponentModel.Component,它实现了终结.对于桌面项目,Visual Studio将组件添加到名为System.ComponentModel.Container components
,它在窗体Disposed时生成Dispose代码 - 它依次释放已添加的所有组件.对于移动项目,将components
生成Dispose代码,但将组件放到曲面上不会生成要添加的代码components
.在调用InitializeComponent之后,您必须在构造函数中自己完成此操作.