Keyword: static
对于一个普通的类,若要访问其中的某个方法/属性一般要先为此类生成一个对象,再通过此对象访问方法/属性。为避免这一“麻烦”,可见此方法用static
关键字进行修饰,声明成一个静态成员。
静态数据
对于普通类中的字段数据,类的每一个对象都会生成/维护各自字段数据的独立副本。而若将一个字段定义为静态,则此类型生成的所有对象将共享内存:若某个对象通过某种方式改变了此静态字段的值,那其他所有对象都将受到影响。
静态数据字段由所有对象共享
类中的静态成员(方法)在其实现中引用类中非静态成员将导致编译错误(因为类型的每个对象实例都有独立的非静态成员,你在大家公有的方法中又怎能确保调用的是你自己的非静态成员呢?)。类似的,在静态成员中将this
操作符用作指示对象的“this”也将报错。
静态构造函数
根据静态数据的特性可知,如果在类的构造函数中对静态数据成员进行初始化工作,那每创建一个新对象时,静态数据的值都将重置,之前所做的更改都将无效。一般设置静态字段是在声明时赋初值,而如果某静态数据的值是在运行时才获取(比如从其他文件中读取某一数据)的,那将如何实现呢?此时应该使用静态构造函数,在其中设置静态数据值。 关于静态构造函数有几点性质:
- 一个类只能定义一个静态构造函数(也即静态构造函数不能被重载)
- 静态构造函数不允许访问修饰符且不接受任何参数
- 静态构造函数永远只执行一次
- (运行库)创建类的实例或首次访问静态成员前调用静态构造函数
- 静态构造函数的执行优先于任何实例级别的构造函数
静态类
若用static
关键字修饰一个类,则其被声明为静态类,其将不能通过new
关键字来创建对象实例。一般想要设计一个“工具类”时才会将一个类声明为静态类————我们使用这个类只是为了使用其中的方法/属性,而不需要创建一个具体的对象。
.NET平台下的system
命名空间中常用的静态类(工具类)有:
Math
数学计算相关函数GC
垃圾回收Console
控制台应用Enviroment
系统环境及平台信息Convert
类型转换Buffer
基元类型数组BitConverter
数据与字节数组转换Nullable
返回值可为null的值类型
与static
关键字相关的还有const
关键字和readonly
关键字
Keyword: const
用 const
关键字修饰的数据为常量数据,其值在赋初值后永远不变。在类中的常量字段是隐式静态的,访问时需加上完全类名前缀。常量数据必须在编译时确定其值。
在定义常量数据时必须对其赋初值,其他任何地方,包括构造函数,都不能对之进行写操作(构造函数在运行时才调用)。
Keyword: readonly
与常量数据相似的,用readonly
关键字修饰的数据称为只读数据/字段,其在定义赋初值后同样不能被修改。但与常量数据不同,其值可在运行时确定,故其可在构造函数内赋初值(当然,其他地方依然不行)。只读字段不是隐式静态的。
静态只读字段
要将只读字段变为静态只需用static
修饰,将其变为静态只读字段。静态只读字段将在类级别公开只读字段。在编译时已知静态只读字段,则其使用方式和常量字段相同;如其在运行时才能确定其值,则要用静态构造函数。