研究什么样的对象才能作为Binding的Target以及Binding将把数据送往何处。
程序的本质就是“数据+算法”,或者说用算法来处理数据以期得到输出结果
静态字段在内存中只有一份拷贝,非静态字段则是每个实例拥有一个拷贝。方法无论是否为静态,在内存中只会有一份拷贝。
-CLR属性(Common Language Runtime),该属性是对private字段的安全访问包装。也可以说是一个private字段在后台支持一个CLR属性。CLR属性不会增加内存的负担。
7.2依赖属性
依赖属性就是一种可以自己没有值,并能通过Binding从数据源获得值(依赖在别人身上)的属性,可以节省实例对内存的开销。拥有依赖属性的对象被称为“依赖对象”。
7.2.1依赖属性对内存的使用方式
- 实例的每个CLR属性都包装着一个非静态的字段。TextBox有138个属性,每个属性包装着一个4字节的字段。试想创建了1000*10个TextBox,那么这些字段就会占用4*138*1000*10/1024大约5M的空间,而我们经常只用Text一个属性,这会浪费很多空间。
- 怎么避免浪费?用得上就带着,用不着就不带,与必要的时候借别人的用。—WPF中依赖属性的原理。
- 在传统.net开发中,一个对象所占用的内存空间在调用new操作符进行实例化的时候就已经决定了。在WPF中,允许对象在被创建的时候并不包含用于存储数据的空间,只保留在需要用到数据的时候能够获得的默认值、借用其他对象数据或实时分配空间的能力—这种对象叫依赖对象Dependency Object(具有GetValue和SetValue两个方法),这种实时获取数据的能力依靠依赖属性Dependency Property。
- WPF开发中,必须使用依赖对象作为依赖属性的宿主,二者结合才能形成完整的Dependency Binding目标被数据所驱动。
7.3附加属性
- 附加属性是一个属性本来不属于某个对象,但由于某种需求而后来被附加上。
也就是把对象放入一个特定环境后对象才具有的属性(被环境赋予的属性)称为附加属性。 - 附加属性的作用就是将属性和数据类型(宿主)解耦,让数据类型的设计更加灵活。
附加属性的本质就是依赖属性,二者仅在注册和包装器上有一点区别。声明的时候使用 public static readonly 三个关键字共同修饰。注册附加属性使用的是RegisterAttached方法
- -