zoukankan      html  css  js  c++  java
  • WPF进阶之接口(2):IDisposable,ICollectionView

    废话不多说,进入正题,先来说说IDisposable,看例子(来自MSDN):
    
    using System;
    using System.ComponentModel;
    
    // 下面的例子将展示一个实施了IDisposable接口和Dispose方法的类
    
    public class DisposeExample
    {
        public class MyResource: IDisposable
        {
           // 指针,指向非托管资源.
            private IntPtr handle;
            //类,托管资源.
            private Component component = new Component();
            // 标志,指示Dispose是否已被调用.
            private bool disposed = false;
    
            // 构造函数.
            public MyResource(IntPtr handle)
            {
                this.handle = handle;
            }
    
            public void Dispose()
            {
                Dispose(true);
                // 调用Dispose需要只是GC不要再调用Finalize().
                GC.SuppressFinalize(this);
            }
    
            private void Dispose(bool disposing)
            {
                // 检查是否已被调用过.
                if(!this.disposed)
                {
                    // 一个标志当在析构函数中,指示为false,别急后续将讲解原因.
                    if(disposing)
                    {
                        //Dispose托管资源.
                        component.Dispose();
                    }
    
                    // 调用Kernel32函数释放非托管资源.
                    CloseHandle(handle);
                    handle = IntPtr.Zero;
    
                    // 标记已经Dispose了.
                    disposed = true;
    
                }
            }
    
            // ImportKernel32中的API,关于如何使用Interop我将在后续中讲解.
            [System.Runtime.InteropServices.DllImport("Kernel32")]
            private extern static Boolean CloseHandle(IntPtr handle);    
    
         //  为了保持代码的可读性性和可维护性,千万不要在这里写释放非托管资源的代码
             // 必须以Dispose(false)方式调用,以false告诉Dispose(bool disposing)函数是从垃圾回
    
        // 收器在调用Finalize时调用的.
    
       ~MyResource()
            {
                Dispose(false);
            }
        }
        public static void Main()
        {
            // 加入代码创建并使用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
    
    《CollectionView详解》
    
    两篇文章都详细介绍如何重写ICollectionView 以实现 排序、分组、过滤、导航等功能。

    http://hi.baidu.com/leo_han/item/900c44e03d8f08a9ce2d4f04 转自

  • 相关阅读:
    数学 之 hdu 4722
    DP + math 之 Codeforces 126D
    计算几何 之 hdu 1077 poj 1981 O(n^2logn)
    计算几何 之 hdu 1077 poj 1981 O(n^3)
    字典树 之 hdu 1800
    字典树 之 poj 1056
    字典树 之 hdu 4099
    字典树 之 hdu 1247
    解决java.sql.SQLException: Value '0000-00-00' can not be represented as java.sql.Date
    显示Mac壁纸所在路径以及接下来的事情你懂得
  • 原文地址:https://www.cnblogs.com/anbylau2130/p/3435441.html
Copyright © 2011-2022 走看看