前言
OOP 少不了类的实例化、对象属性的赋值操作,在类中,经常可以看到 set ; get 的存在,那么他们的作用是什么呢 ? 写个文档,方便以后失忆了查看。
1,set 的使用
有一个 Person 类,类中有一个 int 型的字段 age。
public class Person { public int age; }
实例化 Person 得到一个对象后,给该对象里的 age 赋值为 -5,编译是可以通过的,但是年龄为负数,首先不符合常理,其次如果程序其他地方读取了改数值,并且默认按照 age 大于等于 0 的情况进行计算,就很有可能出现错误。
使用 set 就能完美解决这样的问题:
public class Person { private int _age; //前面加下划线,约定的规范 public int Age //首字母大写,约定的规范 { get { return _age; } set { if (value >= 0) { _age = value; } else { _age = 0; } } } }
注意上面的代码中,字段的修饰词是 private,属性的修饰词是 public,这样外部只能通过属性访问字段的值。
如果字段的修饰词也是 public,那编译也可以通过,外部就能直接读写字段的值,set ; get 就没有意义了。
2,get 的使用
以上面的 Person 类为例,实例化对象,并有以下代码:
Person p = new Person(); p.Age = -5; //给年龄属性赋值为-5,但是由于 set 的存在,最终年龄是0 Console.WriteLine(p.Age); //由于 get 的存在,所以可以获取 _age 的值 Console.ReadKey();
如果把 Person 类中的 get { return _age; } 删掉,则 p.Age 就会报错。
所以 get 的作用是限制类中字段的值是否能被读取,不写,或者写返回 null,其他代码就无法直接读取相应数据。
同理不写 set,其他代码就不能给字段赋值。前提条件是字段的修饰词是 private,这个上面说到过。
综上所述
set ; get 的作用就是保护私有字段,允许外部读、写,外部才能读、写,并且还能对读、写操作进行限制、修正,提高了程序的安全性。
对于公有字段,也可以有 set ; get 属性,但是用户可以直接访问字段, set ; get 就不起任何作用了。