字段
1 什么是字段
·字段(field)是一种表示与对象或类型(类或结构体)关联的变量
·字段是类型的成员,旧称“成员变量”
·与对象关联的字段亦称“实例字段”(实例字段的组合是用来表示对象当前的状态)
对于实例字段而言,初始化的时机是在实例被创建的时候,即每次创建实例都可以执行初始化(实例构造函数执行的时候)
·与类型关联的字段称为“静态字段”,由static修饰(静态字段的组合用来表示某个数据类型当前的状态)
比如下面这个例子:学生这个数据类型的状态是:学生并不多,只有两个
对于静态字段而言,初始化的时机是在运行环境加载数据类型的时候,即只在数据类型第一次被加载的时候执行初始化(静态构造器被执行的时候)
2 字段的声明
·尽管字段声明带有分号,但它不是语句
·字段的名字一定是名词
3 字段的初始值
·无显式初始化时,字段获得其类型的默认值,所以字段“永远不会未被初始化”
·实例字段初始化的时机——对象创建时
·静态字段初始化的时机——类型被加载(load)时
4 只读字段
·实例只读字段
·静态只读字段
属性
1 什么是属性
·属性(property)是一种用于访问对象或类型的特征的成员,特征反映了状态
·属性是字段的自然扩展
·从命名上看,field更偏向于实例对象在内存中的布局,property更偏向于反映现实世界对象的特征
·对外:暴露数据,数据可以是存储在字段里的,也可以是动态计算出来的
·对内:保护字段不被非法值“污染”
·属性由Get/Set方法对进化而来
·不合法的值“污染”字段
·防止不合法的值“污染”字段
·引入更方便的属性的概念
2 属性的声明
·完整的声明——后台(block)成员变量与访问器(注意使用code snippet和refactor工具)
·代码提示propfull
·静态属性的声明
·简略声明——只有访问器(查看IL代码)
·代码提示prop
·通过简略声明声明的属性 在功能上与一个公有的字段完全相同(不受保护)
·好处是:声明起来非常简单,主要作用是传递数据
·动态计算值的属性
·实现目标:16岁以上判定为可以工作;16岁以下判定为不可以工作
·下面的两种方法适用于不同的情况(Student类在两种方法中对外的接口并没有改变,只是改变了内部的逻辑)
·方法一:适用于Age经常被设定为不同的值,而canWork的值不经常被访问的情况(被动计算canWork的值)
·方法二:适用于canWork的值被访问地很频繁的情况(主动计算canWork的值)
·属性的名字一定是名词
·只读属性——只有getter没有setter
·另一种属性(有setter,但是setter是private的,所以它的setter不能从外界进行访问)
3 属性与字段的关系
·一般情况下,它们都用于表示实体(对象或类型)的状态
·属性大多数情况下是字段的包装器(wrapper)
·建议:永远使用属性(而不是字段)来暴露数据,即字段永远都是private或protected的
索引器
1 什么是索引器
·索引器(indexer)是这样一种成员:它使对象能够用与数组相同的方式(即使用下标)进行索引
·索引器一般情况下都是用在集合类型里,下面的例子将索引器应用在了非集合的情况下(很少见)
·初学者很少有机会去写索引器
2 索引器的声明
·参见C#语言定义文档
·注意:没有静态索引器
常量
1 什么是常量
·常量(constant)是表示常量值(即,可以在编译时计算的值)的类成员
·常量隶属于类型而不是对象,即没有“实例常量”
“实例常量”的角色由只读实例字段来担当
·注意区分成员常量与局部常量
①Int.Maxvalue或者Math.PI都是类的成员,所以叫做成员常量;
②局部常量(用于参与组成方法体中的算法)
2 常量的声明
3 各种“只读”的应用场景
·为了提高程序可读性和执行效率——常量(用于存储一个不变的值)
·为了防止对象的值被改变——只读字段
·向外暴露不允许修改的数据——只读属性(静态或非静态),功能与常量有一些重叠
·当希望成为常量的值其类型不能被常量声明接受时(类\自定义结构体)——静态只读字段