属性是方法的一种,经过封装,若从客户端代码看,属性只是一个字段,但属性本身不能存值,但可以通过属性中的访问器实现,忘了在那看到过这样一句话,说变量应总是私有的,而属性的出现很好的保护了数据的安全性,下面是一个示例:- public class Person
- {
- private string name;
- public String Name
- {
- get
- {
- return this.name;
- }
- set
- {
- this.name = value;
- }
- }
- }
复制代码 以上代码定义了一个私有字段name,而定义了共有的属性Name,我们可以通过:- Person ps = new Person();
- ps.Name = "张三";
复制代码 来给使用属性。
以上中的get、set就是访问器,get访问其不带任何参数,但必须返回和属性定义的类型,(上例中的string),get也不带任何显式参数,但set总是有一个默认的参数,类型和属性相同,表示为value,所以通过对get、set的控制,可以实现只读属性,只写属性,例如:- private int age;
- /// <summary>
- /// 只读属性
- /// </summary>
- public int Age
- {
- get
- {
- return this.age;
- }
- }
- private bool sex;
- /// <summary>
- /// 只写属性
- /// </summary>
- public bool Sex
- {
- set
- {
- this.sex = value;
- }
- }
复制代码 也可以给属性加上访问修饰符,以更好的控制,甚至允许对属性设置不同级别的访问修饰符,例如:- public String Name
- {
- private get
- {
- return this.name;
- }
- set
- {
- this.name = value;
- }
- }
复制代码 但不能同时给两个访问器设置访问修饰符,否则会报错。至于为什么我也想不明白(或许是为了有一个和属性的访问级别相同吧,若属性为公有,而两个访问器都是私有,这样属性还有什么用...),我们可以在属性中加入一些逻辑控制,例如限制年龄小于十八岁的:- public int Age
- {
- get
- {
- return this.age;
- }
- set
- {
- if (value < 18)
- {
- throw new Exception("年龄不能小于十八岁");
- }
- else
- {
- this.age = value;
- }
- }
- }
复制代码 若属性中无任何逻辑,可以用自动属性:- /// <summary>
- /// 自动属性
- /// </summary>
- public string Address
- {
- get;
- set;
- }
复制代码 使用自动属性,无需为其创建数据字段,编译器会自动创建。
其他C#基础请看这里
|