一、Get/Set 的疑问
通常来说,我们在 Unity 内声明一些属性,比如:
1 private float hp; 2 3 public int index;
但是,偶尔可能会看到另外一些属性声明的方法,比如:
1 public float Hp 2 { 3 get 4 { 5 return Hp; 6 } 7 set 8 { 9 Hp = value; 10 } 11 }
所以我们就会有疑问:这个 get/set 是什么?为什么要这样写?有什么作用?
二、Get/Set 的理解
首先,这个 get 我们可以理解为 “读”,如果你为一个属性声明了 get 方法,那么每当你调用该属性的时候,就会调用 get 内的方法,也就是我们看到的 get { return Num;},引用该属性后就会调用该属性的 get 方法,在该属性的 get 方法内返回了该属性本身,所以我们就可以拿到这个属性的值。
然后是这个 set,我们可以理解为 “写”,如果你为一个属性声明了 set 方法,那么每当你设置该属性的值的时候,就会调用 set 内的方法,也就是我们看到的 set { Hp = value;},这个 value 就是你在外部为该属性设置的值。比如:你在某个脚本里设置 Hp 的值,Hp = 100 ;那么设置的时候就会调用 set 方法,这个时候 value 就等于 100。
三、Get/Set 的基本用法
使用前提:当要访问被 private 封装的属性的时候
提供访问方式的原因:之所以用 private 封装,又对外提供访问方式(Get/Set),是因为可以在访问方式中加入逻辑判断等语句,对访问的数据进行操作,提高代码的健壮性。
正常我们声明变量,有两种方式:private 和 public,其实这两个也是有 get/set 的,只不过被隐藏了。他们都是可读可取的属性,当我们知道 get/set 的用法之后,就可以把一个属性设置为只读,或者是只写的属性,又或者是可读可写的属性。
1 // 只读属性:只能读取该属性的值 2 private float num_A 3 { 4 get 5 { 6 return num_A; 7 } 8 } 9 // 只写属性:只能给改属性设置值 10 private float num_B 11 { 12 set 13 { 14 num_B = value; 15 } 16 } 17 // 可读可写的属性 18 private float num_C 19 { 20 get 21 { 22 return num_C; 23 } 24 set 25 { 26 num_C = value; 27 } 28 }
四、Get/Set 的具体用法
通常来说,我们很少会直接设置属性的读写属性,通常会通过设置一个外部访问器来限制该属性的内容。比如:
1 private float hp; 2 3 public float Hp 4 { 5 get 6 { 7 return hp; 8 } 9 set 10 { 11 hp = value; 12 } 13 }
在上面的代码中,Hp 就是 hp 的访问器,我们在外部需要获取或者设置 hp 值的时候,访问的是 Hp,获取 Hp 的值,get 中返回的是 hp,设置 Hp 的值,在 set 中将你设置的值 value 赋值给了 hp,这样就达到了访问 hp 的目的。
那为什么要多次一举,不直接将 hp 设置为 public 呢,这是因为安全问题,我们可以通过修改 Hp 的限制条件,来限制最终 hp 的值,来达到一个安全的保障。
比如,要让 hp 始终保持在 0~100 之间,你的 Hp 可以这样写:
1 private float hp; 2 3 public float Hp 4 { 5 get 6 { 7 return hp; 8 } 9 set 10 { 11 if (value > 100) 12 { 13 value = 100; 14 } 15 else if(value < 0) 16 { 17 value = 0; 18 } 19 hp = value; 20 } 21 }
这样一来,不管在外部怎么设置 Hp 的值,hp 的数值永远都不会大于 100 或小于 0,访问器 Hp 就相当于一个滤网,将不合格的过滤掉,来保证后方的安全性。