黑马程序员技术交流社区

标题: 属性 [打印本页]

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

作者: 许庭洲    时间: 2012-12-23 07:07
值得学习ing!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2