一、属性的来龙去脉
程序的本质是“数据+算法”
C#语言规定:对类有意义的字段和方法使用static关键字修饰,称为静态成员;
静态字段在内存中只有一个拷贝,非静态字段则是每个实例拥有一个拷贝,无论方法是否为静态在内存中只会有一份拷贝。
使用属性的目的就是为了避免把数据直接暴露给外界。
属性就是Get和Set这对方法。
二、CLR属性
.NET Framework中的属性又称为CLR属性,是private字段的安全访问包装,实例的每个CLR属性都包装着一个非静态的字段。
三、依赖属性
是一种可以自己没有值,并能通过使用Binding从数据源获得值的属性。
优点:1.节省实例对内存的开销;2.属性值可以通过Binding依赖在其他对象上。
重要结论:WPF所有UI控件都是依赖对象。
public class Student:DependencyObject { public string Name//CLR属性外包装 { get { return (string)GetValue(NameProperty); } set { SetValue(NameProperty, value); } } // Using a DependencyProperty as the backing store for Name. This enables animation, styling, binding, etc... public static readonly DependencyProperty NameProperty = DependencyProperty.Register("Name", typeof(string), typeof(Student)); }
如代码所示,依赖对象的概念由DependencyObject类所实现,依赖属性由DependencyProperty类所实现;成员变量被public static readonly 修饰,它的实例由DependencyProperty.Register创建。
private void Button_Click(object sender, RoutedEventArgs e) {
Student stu = new Student();
stu.Name = this.TextBox1.Text;
TextBox2.Text = stu.Name;
}
上述所示就是利用依赖属性来存储值并把值读取出来,注意这样子的写法是因为用了CLR属性外包装,这样依赖属性使用时与普通的CLR属性别无二致。
尽管Student类(依赖对象)没有实现INotifyPropertyChanged接口,当属性的值发生变化时,与之关联的Binding对象依然可以得到通知。
三、依赖对象
传统的.NET开发中,一个对象所占用的内存空间在调用new操作符进行实例化时就已决定。而依赖对象在被创建时不占用空间,只保留在需要用到数据时能够获得数据,实时分配空间的能力。