什么是属性?
属性是字段和方法的交集。
属性的声明类似如下:
属性包含两个代码块,分别以get和set关键字开头。get块包含读取属性时候执行的语句,set块包含在向属性写入时执行的语句.
还可以简化语句,类似如下:
注意:使用属性的时候不要写错了
类似上面这种写法会造成无限递归,会抛出*Exception异常,一般我们习惯把私有方法和字段以小写字母开头,公共方法和字段以大写字母开头.
上面的代码把小写写成了大写,引用的是属性,而属性又引用属性,无限递归。
使用属性
使用属性和使用字段是一样的语法。
从属性取值时,编译器自动将字段风格的代码转换成对属性的get访问器的调用.
向属性赋值时,编译器自动将字段风格的代码转换成对该属性的set访问器的调用.
…
…
只读属性
可声明只含get访问器的属性,这称为只读属性.
由于没有set访问器,就无法修改monkey的名字.
只写属性
类似地,也可以声明只含set访问器的属性:
这样就无法访问名称了,只写属性适用于对密码这样的数据进行保护.
属性的可访问性
声明属性时要指定可访问性,在属性声明中,可以为set和get访问器单独指定可访问性,从而覆盖属性的可访问性:
属性的局限性
属性本质是方法而非字段.
1.只有在结构或类初始化好之后,才能通过该结构或类的属性赋值。
2.不能将属性作为ref或out参数传给方法,因为属性并不真正执行一个内存位置,它指向的是一个访问器方法.
3.属性最多只能包含一个get和一个set访问器,不能包含其他方法、字段和属性.
4.get和set访问器不能获取任何参数。要赋的值会通过内建的、隐藏的value变量自动传给set访问器
5.不能声明const属性.
…
…
…
在接口中声明属性
接口除了能定义方法,还能定义属性.
比如:
实现接口的任何类或者结构都必须实现X和Y属性.比如:
在类中实现接口规定的属性时,还可以将属性声明为virtual,允许派生类重写.
还可以使用显示接口实现语法来实现属性.
…
…
…
自动属性
C#编译器可以自动为属性生成代码,比如:
之前我们使用属性是这样写的,现在可以使用自动属性:
自动属性的语法和接口中的属性语法几乎相同,区别是能为自动属性指定访问修饰符,比如private,public.
使用自动属性不必指定这个属性是如何工作的,所以上面get和set访问器都是空白的。c#编译器自动将这个定义转换成私有字段以及一个默认的实现.
在属性声明中省略空白set访问就可以创建只读自动属性。但是不能创建只写自动属性,会造成编译时错误.
用属性初始化对象
上面的初始化方法称为对象初始化器或初始化列表。
像这样调用对象初始化器,C#编译器会自动生成代码来调用默认构造器,然后调用每个具名属性的set访问器,把它们初始化成指定值.还可以像下面这样使用初始化器.