针对 C# 中的字段和属性, 很多初学者无法区分这两者之间的区别.
字段与属性比较
字段; 是一种 "成员变量", 一般在类的内部做数据交互使用, 占用内存空间.
属性: a. 是一种逻辑变量, 一般跟字段一起结合起来使用, 是字段的扩展, 并不占用实际的内存.
b. 属性其实就是外界访问私有字段的入口, 属性本身不保存任何数据. 在面向对象设计中主要使用属性描述对象的静态特征.
c. 属性设置过程中一般会用到 get 和 set 两个方法. 可以在方法里加入逻辑处理数据, 灵活拓展使用.
标注: 因为属性不占用实际内存, 所以属性不能用于方法的 ref 类型参数
下面举个栗子, 如下所示
- public Class Student
- {
- private DateTime _Birthday;
- private string _Name;
- public string Name
- {
- get{
- return _Name;
- }
- set {
- this._Name=value;
- }
- }
- public int Age
- {
- get {
- return DateTime.Now.Year-this._Birthday.Year
- }
- }
- }
在这个例子中,_Name 是字段, 而 Name 为属性, Name 属性的 get 方法为返回学生的姓名, Set 方法则是对_Name 字段进行赋值.
Age 也是类中的一个属性, 只不过这个属性是只读属性, get 方法返回格式化之后的年龄数据, 这就是使用属性很好的控制了返回数据的格式, 不然还得专门写个方法去格式化数据.
同时, 属性也可以通过相应的条件对字段赋值进行相应的限制, 比如我们要限定 Student 的名字长度最长不能超过 5 个字, 超过 5 个字的, 我们就只截取前面 5 个字符即可.
为了实现这种效果, 我们可以在 set 方法内做逻辑规则运算, 即可轻松实现想要的效果, 如下所示, 设置 Name 属性为:
- Public string Name
- {
- get {
- return _Name
- }
- set
- {
- if(value.Length>5)
- this._Name=value.Substring(0,5);
- else
- this._Name=value;
- }
- }
直接对字段赋值是无法达到上述效果, 你需要在每次给字段赋值的时候, 调用函数获取理想值. 使用属性可以完美避免非法数据.
使用属性的情况:
要求字段只能读或者只能写;
需要限制字段的取值范围;
在改变一个字段的值的时候希望改变对象的其它一些状态;
使用字段的情况:
允许自由读写;
取值范围只受数据类型约束而无其他任何特定限制;
值的变动不需要引发类中其它任何成员的相应变化.
最后, 附上我的 ASP.NET 学习群, 欢迎各位同行入群指导交流. 技术群:[ASP.NET 技术社区] 872894940
来源: https://www.cnblogs.com/xu-yi/p/10025735.html