标签:10 刘铁猛 只读 C# 初始化 字段 set 声明 属性
这四种东西都是用来表达数据的
一、字段(成员变量)
曾用名:成员变量
是为一个对象或类型存储数据的变量,区别于方法体中的局部变量
多个字段组合起来可以表示对象当前的状态
起源:C语言中结构体的成员变量
一个对象占用的内存空间会被分配给各个字段
1.实例字段和静态字段
可以分为实例字段和静态字段
类比实例方法和静态方法,一个属于实例对象,一个属于类型
例如年龄、成绩等字段隶属于个人,是实例字段
而平均年龄、平均成绩隶属于整体学生,是静态字段
2.字段的声明
编程规范:声明字段时,变量名必须是一个名词
字段的声明要写在类体的大括号里,不能写在方法体大括号里
字段声明时可以用以下修饰符
注意修饰符组合使用时,必须是有意义的,不能自相矛盾
字段的声明后面可以接初始化器,给其赋一个初值,若不初始化,其初值为对应类型的默认值
对于实例字段,其初始化的时机是这个实例创建的时候
对于静态字段,其初始化的时机是在运行环境加载这个数据类型的时候,只执行一次
编程规范:若需要初始化,尽量在声明时就将其初始化
3.只读字段readonly
添加只读修饰符readonly后,成为只读字段
只读实例字段,只能在该类型的实例构造器中初始化,之后不能再赋值
只读静态字段,只能在声明或静态初始化器中初始化,之后不能再赋值
ex:静态构造器(看看图一乐,不常用)
以下两种表达等价
二、属性
1.属性与字段
属性是在字段的基础上的发展来的,
可以看做进化后的字段
字段更偏向实例对象在内存中的布局,属性更偏向于反应现实世界对象的特征
弹幕:“属性一般设计用来让外部访问;字段是内部特征,一般不对外公开”
对外暴露数据时,数据可以存在字段里,也可以是动态计算出来的
对外暴露数据时,字段存储的数据可能非法,例如人的年龄为100000岁,但属性可以通过一些逻辑,保护数据,防止其被不符合逻辑的非法值污染
2.get-set方法与属性的由来
属性起源于get-set方法对,一种用来保护
字段的常用方法
首先将字段变为
私有变量private,使其不能被
直接访问,以
保护字段
然后通过
get方法来
读取字段,通过
set方法来
改写字段
出现非法值被输入
调用时:
在C++、JAVA中,仍然是用这样的方法来保护字段,非常常用
3.属性的本质
所以C#将上文这种非常常用的字段保护方法提炼了出来,变成了属性
属性的读取、改写方法可以和普通变量一模一样!
这样就兼顾了
对字段的逻辑保护与
代码语法的简洁性、可读性
C#属性表达和上文中的字段保护方法表达,编译后是一样的
也就是说,属性的本质就是C#的一种语法糖
4.C#属性使用方法详解
(1)属性的可读写性
有些属性既有get又有set,可读可写
有些属性只有get,没有set,称作
只读属性
有些属性只有set,没有get,称作
只写属性(不常用)
像只读属性赋值程序会报错
特例:如果只把set方法私有化private,这样并不是只读属性
这个字段在声明他的类的外部,无法改写
但在声明他的类中,是可以改写的
而如果直接删除set方法,变成只读属性,则其在本类中也无法改写
(2)属性的完整声明
在VS中,输入
propfull,然后按两下
tab
就会得到:
之后按一下回车,然后更改set和get,将需要的逻辑加入进去
静态属性声明示例:(字段名和属性名前面都要加上static)
(3)属性的简略声明
通过简略声明声明的字段,和一个公有的普通字段是完全一样的,
不受保护
但是声明起来特别方便,一般用来
传递数据,用来给外部访问
声明方法:
在VS中输入
prop,直接敲两下
TAB
然后就会出现:
方便外部访问调用,但不提供保护逻辑
(4)vs旗舰版的字段快捷封装功能
先有一个字段
然后将其改为私有private、小写字段名字
将光标移动到字段名上,选择 edit编辑→refactor重构→封装字段
然后可以选择封装为属性,并会在全文搜索这个属性会不会有冲突,点应用就会自动封装为属性
快捷键:光标放在字段名上时,按下ctrl + R + E
5.动态计算值的属性
(1)主动式,读取时计算值
属性值的计算逻辑写在
属性内,
读取属性时
主动调用计算逻辑,得出其值
(2)被动式,改写时计算值
属性值的计算逻辑作为一个
单独函数写在
属性外,
关联属性被改写时调用这个函数
属性的值在
关联属性被改写时
被动地一起改变
需要被
频繁访问的属性,不断主动计算其值会损耗性能,所以使用
被动式
关联属性需要被
频繁改写的属性,不断地被动计算其值会损耗性能,所以使用
主动式
根据实际情况选择性能最优的方式
实践建议:
最好永远使用属性来向外暴露数据,裸字段最好永远是private或protected
标签:10,
刘铁猛,
只读,
C#,
初始化,
字段,
set,
声明,
属性
From: https://www.cnblogs.com/jk-2048/p/18030530