废话不多说,进入正题,先来说说IDisposable,看例子(来自MSDN): using System; public class DisposeExample // 为了保持代码的可读性性和可维护性,千万不要在这里写释放非托管资源的代码 // 收器在调用Finalize时调用的. ~MyResource() }
分析: 1.WPF中资源释放有哪几种方式?他们的内在关系? WPF中有两种释放资源的方法Dispose() 和 Finalize。 Dispose()由用户调用,Finalize()由GC调用。调用Dispose将释放托管和非托管资源,Finalize被GC调用时仅仅释放非托管资源。 当WPF程序较大时,程序员不能过分依赖GC,应该为各个自定义类实现IDisposable接口(如上例所示),并且在适当时候显示调用Diaposable方法。 2.IDisposable实施的要点 需要注意的有三点: 第一编写Dispose时要避免GC调用Finalize,重复销毁非托管资源。影响程序效率; 第二,在 Dispose(bool disposing)中需要分清层次,即是否已经dispose过( 通过disposed ),是否需要dispose托管资源; 第三,在析构函数中一定要Dispose(false)指示方法不要去dispose托管资源。因为在类析构的时候,GC将调用,用户不必再重复dispose托管资源,将此工作交给GC,这里注意一点,为什么在此时候,Finalize()以释放非托管资源,不禁止Dispose重复释放非托管资源。需要注意的是,Finalize一般只有默认实现,用户需要重写他才能实现具体非托管资源的释放,那么系统默认的Finalize()实际上没有作用。 一般实现自定义类的资源释dispose推荐使用实现IDisposable接口,这样可实现类托管和非托管资源dispose。 3. 进一步分析资源销毁的实质 使用Dispose() 和 Finalize都不能保证资源的立刻销毁,只是告诉GC这个资源我不用了,并加入GC的回收列表,当GC满足回收条件时,才会回收并销毁资源。那么如何知道GC的回收原理呢。请看后续章节。
ICollectionView接口
使用过ItemsControl控件的人都熟悉,可以将任意类型的变量集合赋值给ItemsSource属性,可以调用ItemsControl的方法实现集合成员的排序、分组、过滤、导航等功能。其实质是ICollectionView的功能。当一个集合赋值给ItemsSource属性后,ItemsControl自动给该集合包一层ICollectionView,并实现其方法。 具体实现请参看: 《WPF揭秘3》:Page 210--216 |
WPF进阶之接口(2):IDisposable,ICollectionView
最新推荐文章于 2022-04-24 13:12:42 发布
WPF进阶之接口(2):IDisposable,ICollectionView
2010年10月21日 星期四 10:40