–刘铁猛《C#语言入门详解》
字段
什么是字段
- 字段是一种表示与对象或类型关联的变量
- 字段是类型的成员。旧称”成员变量“
- 与对象关联的字段称作”实例字段“
- 隶属于某个对象,某个对象的实例字段组个起来就表示了这个对象的当前状态
- 与类型关联的字段称作”静态字段“,有static修饰
- 隶属于某个类型,用来表示某个类型当前的状态
字段的声明
- 字段声明在类里
- 最简单的形式:类型+名称: int MyField
- 字段的声明带有分号,但不是语句
- 字段的名字一定是名词
字段的初始值
- 无显式初始化时,字段获得其类型的默认值,所以字段“永远都不会未被初始化”,换句话说:字段一定有初始值。
- 实例字段初始化的时机:对象实例化创建时,若要改变初始值:
- 在实例构造函数中:“this.实例字段 = 初始值”
- 在声明中:类型+实例字段=初始值
- 静态字段初始化的时机:类型被加载时
总结:
实例字段的初始化时机实在创建一个对象的时候进行。
静态字段的初始化时机实在运行环境加载该数据类型的时候,并且静态字段的初始化执行一次,即第一次被加载的时候。
只读字段
- 实例只读字
- 静态只读字段
属性
什么是属性
- 属性是一种用于访问对象或类型的特征的成员,特征反映了状态
- 属性是字段的自然扩展
- 命名:字段更偏向于实例对象在内存的布局。属性更偏向反映现实世界对象的特征
- 对外:暴露数据,数据可以是存储在字段里,也可以是动态计算出来的
- 对内:保护字段不被非法值“污染”
- 属性由Get/Set方法进化而来 原始版
- 这个方法就是人们最初用来保护值不被污染的方法
- 在c++,java中依然在使用这个方法(这两种语言中没有属性)
C#版
属性中的value是自带,叫做“上下文关键字”,代表用户传进来的值。
属性的本质
- 属性的本质是两个方法get 和 set。 用于对外提供访问类内private字段的路径。
- 属性可以理解为一个语法糖。get 方法是提供类外获取private字段值的途径,set 方法是提供类外对类内private字段赋值的合法途径。
属性的声明
- 完整声明:后台成员变量和访问器(上图)
- 简略声明:只有访问器
- 例:public int Age{get; set;}
- 动态计算值的属性
- 注意实例属性和静态属性
- 属性的名字一定是名词
- 属性有“只读”和“只写”,但是基本见不到“只写”。
属性和字段的关系
- 关系
- 属性和字段都用于表示实体的状态
- 属性是字段的包装器(wrapper),可以看作属性是字段的延伸
- 建议使用属性来暴露数据(属性可以是public的,字段最好private和protected)
属性 | 字段 | |
---|---|---|
归属 | 函数成员 | 类成员 |
内存 | 不一定分配内存 | 根据类型分配内存 |
操作 | 执行代码操作 | 赋值和读取 |
索引器
什么是索引器
- 索引器是一组get和set访问器,是一种特殊的属性,允许类的实例像数组一样通过索引来访问和设置对象的元素
- 通过索引器,可以为类提供类似数组的访问方式,使得对象可以像集合一样进行索引访问。
- 拥有索引器的类一般都是集合类型(有例外)
索引器和属性
属性 | 索引器 | |
---|---|---|
内存分配 | 不需要分配内存来存储 | 不需要分配内存来存储 |
关联的数据成员数量 | 单个 | 单个或多个 |
索引器的声明
- 格式:类型+this+[参数]
- 和属性一样:有一个类型和set/get访问器
- 和属性不同:索引器方括号内必须要有参数,索引器没有名称,在名称的位置是关键字this。
常量
什么是常量
- 常量:用来表示常量值的类成员(要避免跟静态成员搞混)
- 成员常量:类的成员
- 局部常量:在局部声明的常量
常量和静态成员的比较
相同点:
1. 共享性质:常量和静态成员都是在类级别上定义的,可以被该类的所有实例共享。
2. 不可修改性:常量和静态成员的值在程序运行时通常是不可修改的。
不同点:
1. 值的特性:常量的值在编译时必须被赋值并且不能被改变;静态成员的值在运行时被赋值,但通常也不能被修改。
2. 定义方式:常量使用 const 关键字定义,并且必须在声明时进行初始化;静态成员使用 static 关键字定义,可以包括静态字段、静态属性、静态方法等。
3. 范围:常量是针对值类型的,而静态成员可以是值类型或者引用类型。
4. 存储方式:常量的值在每个使用它的地方都会被直接替换为其字面值,而静态成员的值在内存中只有一份。
总的来说,常量和静态成员都用于在类级别上表示固定值或共享状态,但它们的定义、赋值和使用方式有所不同。