【了解属性和字段】
我们知道,属性是面向对象语言中用来封装字段的外衣,它像是字段对外界的桥梁,我们可以通过属性来验证数据的合法性或控制对外的访问性等等 。每个属性的背后都有其对应的一个字段做支撑,就算是自动属性,在编译时系统也会创建其字段,只不过自动属性是微软给我们的语法糖罢了 。在C#中,属性最后是会编译成两个方法:get_属性名和set_属性名(假如是只读属性,则没有set方法,反之没有get方法) 。
编译成方法,属性就不会占用太多空间,因为方法存在于内存公共的方法区,每个实例的创建不过是多一个指向该方法的指针 。但是字段不一样,每个实例创建的创建,都会在内存中开辟对应的空间来存放字段,一个类中的字段越多,它在内存中占用的空间就越大,理解了这个理论,下面我们来正式说明什么是依靠属性,为什么要有依靠属性 。
我们使用一个控件,可以看到这个控件有很多的属性,有属性就有字段的内存开销,但实际上对于一个控件,我们大多数只会使用其部分常用属性,比如Button我们最常使用Content,Height等属性,那些不常常使用的属性相称于白白占用着内存 。当我们写一个复杂的XAML页面,涉及到很多控件的使用时,这种浪费内存的现象就很严峻 。
对此,微软在WPF中引入了依靠属性(Dependency Property),依靠属性答应没有自己的字段,可以通过Binding绑定到其它对象的属性或者说数据源上,从而获得值,这种依靠在其它对象上的属性,就是依靠属性,当明确了它的功能,我想大家就不会对依靠二字产生迷惑了,依靠属性没有自己的字段,只在使用时通过Binding从别的对象身上获取,给自己临时创建内存空间,这样不使用就不会有多余内存消耗 。
【微软WPF是什么 wpf是什么】 包含依靠属性的对象称为依靠对象(Dependency Object),这种对象需要继续DependencyObject这个基类,实际上,WPF中的控件,都继续了DependencyObject这个类,控件中的大部分属性都是依靠属性,这样我们才能通过Binding去绑定值(不认识Binding的同学可以参见前文Binding(一):数据绑定系列),才不会有内存浪费现象的发生 。
下面我们通过代码来学习一下如何声明并使用依靠属性,请先看我写好的一段代码:
public class Pikachu : DependencyObject{public static readonly DependencyProperty PikachuNameProperty =DependencyProperty.Register("PikachuName",typeof(string),typeof(Pikachu));} 上文说到,使用依靠属性必须要继续DependencyObject类,另外,声明
依靠属性,需要使用public static readonly三个修饰符修饰,实例依靠属性也不是通过new操作符,而是通过DependencyProperty的Register方法来获取 。
依靠对象的名字,有个约定,就是以Property为后缀,在C#中有很多命名约定,比如接口用I做前缀,特性用Attribute做后缀等等,这样做都是为了有个良好的命名规范,做到见名知意 。
Register方法有三个重载,此处用的是其三个参数的重载,它还有四个参数和五个参数的重载 。
第一参数是指定依靠属性的包装器名称是什么(包装器就是用来包装依靠属性的,通过一个属性来包装依靠属性供外部使用,详细下文会讲,此处先做了解)第二个参数是指定依靠属性要存储的值的类型是什么第三个参数是指定依靠属性属于哪个类的,或者说是为哪个类定义依靠属性其它重载中第四个参数是指定依靠属性的源数据,用于提供应调用者此依靠属性的信息其它重载中第五个参数是自定义的依靠属性生成时的验证回调 声明了依靠属性,但是如何给依靠属性赋值呢,这就要用到DependencyObject基类中的方法了,我们使用其中的SetValue方法和GetValue方法来操作依靠属性的值,请看下面改动后的代码:
public class Pikachu : DependencyObject{public string PikachuName{get =
- 2022年最可能暴涨的东西是什么
- 松花蛋吃多了会致癌吗,松花蛋的松花是什么物质
- 梦见扫地是什么意思
- 梦见虾和螃蟹是什么意思
- 梦见穿越到古代是什么意思
- 梦见迷失方向是什么意思
- 梦见没赶上公交车是什么意思
- 梦见和情敌打架是什么意思
- 梦见自己洗衣服停水是什么意思
- 梦见海参是什么意思