属性
属性访问器的由来
- 变量可以用来描述事物的特征。
class Hero { // 金币数量 public int gold; }
- 变量有三个功能:存储数据、读数据、写数据。
static void Main() { Hero lk = new Hero(); lk.gold = 100; // 写数据 Console.WriteLine(lk.gold); // 读数据 }
实现对读和写的独立访问控制。
如果变量是
public
的那么外界即可以读取数据也可以写入数据。如果变量是private
的那么外界即不能读取数据也不能写入数据。用访问修饰符对读写的控制总是同步的。如何实现只读或者只写呢?class Hero { // 将变量设为private,这样外界即不能读取变量也不能写入变量。 // 那么现在这个变量的功能就只剩下了单纯的存储数据。 private int gold; // public一个外部能访问的方法。 // 通过这个方法间接的访问gold变量。 public int GetGold() { return gold; } // 提供一个参数让外界间接的给gold变量赋值 public void SetGold(int value) { gold = value; } } // 这样我们就将变量的三个功能:存储数据、读数据、写数据,都独立出来了。 // 如果要实现只能读取变量不能写入变量,把SetGold函数去掉就可以了。 class Program { static void Main() { Hero lk = new Hero(); // lk.gold = 100; // ERROR:gold是私有的,不能写入。 lk.SetGold(100); // OK // Console.WriteLine(lk.gold); // ERROR:gold是私有的,不能读取。 Console.WriteLine(lk.GetGold()); // OK } }
属性访问器
上例中的中
GetGold
方法就是读访问器,SetGold
方法就是写访问器。 这样就可以对变量gold
的读和写进行独立的控制。
- C#语言提供了一种更简化的语法来实现属性访问器。
属性访问器的使用方式和变量一样。如果是对属性赋值就是调用
set
访问器,如果是获取属性的值就是调用get
访问器。class Hero { private int gold; // 属性访问器的名字叫Gold与上面的变量gold是完全不同的两个名字。 // 他们两者之间也没有直接的关系。 public int Gold { get // 定义读访问器 { // 这段代码和上例中GetGold的代码一样 return gold; } set // 定义写访问器 { // 这段代码和上例中SetGold的代码一样 // value是一个C#关键字,相当于SetGold的参数。 gold = value; } } } class Program { static void Main() { Hero lk = new Hero(); lk.Gold = 100; // 调用Gold的set访问器,这时会把100赋值给set访问器中的value。 Console.WriteLine(lk.Gold); // 调用Gold的get访问器。 } }
属性访问器的类型说明了,
get
访问器返回的数据类型,set
访问器中value
的数据类型。- 属性访问器的本质就是函数,仅仅提供了对变量的间接访问,存储数据是由变量完成的。
可以只定义读访问器,也可以只定义写访问器。
class Hero { private int gold; // 只读的属性访问器 public int Gold { get { return gold; } } }
如果只是提供对变量的直接读写操作,可以连变量的申明都简化掉。
class Hero { // 可读可写属性 public int Level { get; set; } // 只读属性 public int Gold { get; private set; } }
- 这种方式只是一种简写。数据还是存储在变量中,只是这个变量由编译器偷偷的帮我
- 们申明。
属性的使用
- 属性可以用来控制对变量只读、只写或者可读可写的访问。
属性访问器可以用来做一些额外的访问控制。
class Hero { public string id; public string pwd; private int gold; // 只读属性 public int Gold { get { // 读访问控制:只有验证通过了才能访问数据。 if (id == "likang" && pwd =="password") return gold; return -1; } set { // 写访问控制:确定输入的数据是有效的。 if (value >= 0) gold = value; } }
属性访问器不一定是要读写某个变量。
class Example { private int[] data = {11, 32, 12, 51, 62, 21, 9, 13}; // 获取最小数据 public int Min { get { int min = data[0]; for(int i = 0; i <data.Length; i++) { if (data[i] < min) min = data[i]; } return min; } } }