属性

个人理解就是C++中用于外部类调用该类的数据成员的方法,通过访问器声明可包含一个 get 访问器、一个 set 访问器,或者同时包含二者。例如:

  1. // 声明类型为 string 的 Code 属性
  2. public string Code
  3. {
  4. get
  5. {
  6. return code;
  7. }
  8. set
  9. {
  10. code = value;
  11. }
  12. }

一般采用Pascal命名法(首字母大写),数据类型要和对应的字段要一致。
value关键字就是当前类属性的值,比如下面的第8行的private int experience。

  1. using UnityEngine;
  2. using System.Collections;
  3. public class Player
  4. {
  5. //成员变量可以称为
  6. //字段。
  7. private int experience;
  8. //Experience 是一个基本属性
  9. public int Experience
  10. {
  11. get
  12. {
  13. //其他一些代码
  14. return experience;
  15. }
  16. set
  17. {
  18. //其他一些代码
  19. experience = value;
  20. }
  21. }
  22. //Level 是一个将经验值自动转换为
  23. //玩家等级的属性
  24. public int Level
  25. {
  26. get
  27. {
  28. return experience / 1000;
  29. }
  30. set
  31. {
  32. experience = value * 1000;
  33. }
  34. }
  35. //这是一个自动实现的属性的
  36. //示例
  37. public int Health{ get; set;}
  38. }
  1. using UnityEngine;
  2. using System.Collections;
  3. public class Game : MonoBehaviour
  4. {
  5. void Start ()
  6. {
  7. Player myPlayer = new Player();
  8. //属性可以像变量一样使用
  9. myPlayer.Experience = 5;
  10. int x = myPlayer.Experience;
  11. }
  12. }

从编译器理解

a.属性其实就是外界访问私有字段的入口,属性本身不保存任何数据,在对属性赋值和读取的时候其实就是操作的对应私有字段。
图例:
字段和属性 - 图1
b.属性本质其实就是一个方法,通过get和set方法来操作对应的字段,通过反编译工具我们可以看出,如图:
字段和属性 - 图2

属性的意义

A.避免出现非法数据,例如一个年龄属性,正常逻辑是年龄是不可以出现负数的,如果用户对年龄进行了负数的赋值,我们通过属性的set方法加入判断逻辑,从而排除这种非法数据。
示例:
字段和属性 - 图3
B.限定属性只读或者只写,例如有些属性为了保护数据,我们只能读取,而不能赋值。具体使用的话,我们根据需要,屏蔽set或get方法达到只读和只写。
示例:
字段和属性 - 图4
C.没有对应私有字段的属性,例如根据生日属性获取到年龄。
示例:
字段和属性 - 图5

字段

关于字段

a.字段又称为:“成员变量”,一般在类的内部做数据交互使用。
b.字段命名规范:camel命名法(首单词字母小写)。

  1. public class Myclass
  2. {
  3. private int age
  4. public string name;
  5. }

字段与属性比较

a.字段主要是为类的内部做数据交互使用,字段一般是private。
b.字段可读可写。
c.当字段需要为外部提供数据的时候,请将字段封装为属性,而不是使用公有字段(public修饰符),这是面向对象思想所提倡的。