一、常量(constant)
1.什么是常量
常量是表示常量值(即,可以在编译时计算的值)的类成员
常量隶属于类型而不是对象,即没有“实例常量”
“实例常量”的角色由只读实例字段来担当
注意区分成员常量与局部常量
2.常量的声明
各种“只读”的应用场景
为了提高程序可读性和执行效率—常量
为了防止对象的值被改变—只读字段
向外暴露不允许修改的数据—只读属性(静态或非静态),功能与常量有一些重叠
当希望成为常量的值其类型不能被常量声明接受时(类/自定义结构体)—静态只读字段
二、字段
1.什么是字段
字段(field)是一种表示与对象或类型(类与结构体)关联的变量
字段是类型的成员,旧称“成员变量”
与对象关联的字段亦称“实例字段”
与类型关联的字段称为“静态字段”,由static修饰
2.字段的声明
参见C#语言定义文档
尽管字段声明带有分号,但它不是语句(语句只在函数体里,字段只在类体里)
字段的名字一定是名词
3.字段的初识值
无显式初始化时,字段获得其类型的默认值,所以字段“永远都不会被初识化”
实例字段初识化时机—对象创建时
静态字段初始化的时机—类型被加载(load)时
4.只读字段
实例只读字段
静态只读字段
三、属性(property)
1.什么是属性
属性是一种用于访问对象或类型的特征的成员,特性反映了状态
属性是字段的自然扩展
从命名上看,字段(field)更偏向于实例对象在存储的布局,属性更偏向于反映现实世界对象的特性
对外:暴露数据,数据可以是存储在字段里,也可以是动态计算出来的
对内:保护字段不被非法值“污染”
属性由Get/Set方法进化而来
又一个“语法糖”—属性背后的秘密
2.属性的声明
完整声明—后台(back)成员变量与访问器(注意使用code snippet和refactor工具)
简略声明—只有访问器(查看IL代码)
动态计算值得属性
注意实例属性和静态属性(用static修饰,隶属于数据类型)
属性的名字一定是名词
只读属性—只有getter没有setter
尽管如法正确,几乎没有人使用“只写属性”,因为属性的主要目的是通过向外暴露数据而表示对象/类型的状态
3.属性与字段的关系
一般情况下,他们都用于表示实体(对象或类型)的状态
属性大多数情况下是字段的包装器(wrapper)
建议:永远使用属性(而不是字段)来暴露数据,即字段永远都是private或protected的
四、索引器(indexer)
1.什么是索引器
索引器是这样的一种成员:它使对象能够与数组相同的方式(即使用下标)进行索引
2.索引器的声明
参见C#语言定义文档
注意:没有静态索引器