(三)依赖项属性的特性
对内存的使用方式WPF的依赖属性是怎么节约内存的? 依赖项属性 DependencyObject中有两个方法GerValue(),SetValue(),这两个方法都以DependencyProperty对象为参数。 DependencyObject在Wpf中属于底层的类如下: 依赖属性值存取的秘密
我们从依赖属性的使用的两个大致步骤进行分析。1创建对象,2存取值: 创建一个DependencyProperty实例并用它的CLR属性名和宿主类型名生成hash code ,最后把hash code 和DependencyProperty实例作为Key-Value对存入全局的,名为PropertyFromName的Hashtable中这样,WPF属性系统通过属性名和宿主类型就能从这个全局的Hashtable中检索出对应的DependencyProperty实例。
private static Hashtable PropertyFromName = new Hashtable();
上面中的hash code 还不是最后的DependencyProperty对象的实例的哈希值(上面是哈希表的下标)。每一个DependencyProperty实例都有一个名为GlobalIndex的int类型属性,这个GlobalIdnex的值是经过一定的算法得到的。它是唯一的,而且DependencyProperty的GetHashCode方法被重写了: public override int GetHashCode()
{
return GlobalIndex;
}
这个GlobaIndex就是DependdencyProperty的哈希值。只要通过这个值就可以检索到DependencyProperty具体的实例。 到了此处DependencyProperty的实例已经被创建并注册到Hashtable中了。
在DependencyObject中有一个私有的数组变量: private EffectiveVakueEntry[] _effectiveValues;
在这里每一个EffectiveValueEntry的实例都关联着一个DependencyProperty。它们根据GlobalIndex进行关联。在EffectiveValueEntry中为ProppertyIndex。它们两的含义相同。 上面的数组就为我们提供了依赖属性存储值的秘密。当某个依赖属性的值要被读取的时候,算法就会从这个数组中去检索,如果不包含,算法就会返回依赖属性的默认值。(默认值就是在DependencyProperty中的那个Metadata提供的) 所以被static所修饰的依赖属性对象的作用是用来检索真正的属性值而不是存储值。
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |