Keyword: static

对于一个普通的类,若要访问其中的某个方法/属性一般要先为此类生成一个对象,再通过此对象访问方法/属性。为避免这一“麻烦”,可见此方法用static关键字进行修饰,声明成一个静态成员

静态数据

对于普通类中的字段数据,类的每一个对象都会生成/维护各自字段数据的独立副本。而若将一个字段定义为静态,则此类型生成的所有对象将共享内存:若某个对象通过某种方式改变了此静态字段的值,那其他所有对象都将受到影响。

静态数据字段由所有对象共享

类中的静态成员(方法)在其实现中引用类中非静态成员将导致编译错误(因为类型的每个对象实例都有独立的非静态成员,你在大家公有的方法中又怎能确保调用的是你自己的非静态成员呢?)。类似的,在静态成员中将this操作符用作指示对象的“this”也将报错。

静态构造函数

根据静态数据的特性可知,如果在类的构造函数中对静态数据成员进行初始化工作,那每创建一个新对象时,静态数据的值都将重置,之前所做的更改都将无效。一般设置静态字段是在声明时赋初值,而如果某静态数据的值是在运行时才获取(比如从其他文件中读取某一数据)的,那将如何实现呢?此时应该使用静态构造函数,在其中设置静态数据值。 关于静态构造函数有几点性质:

  1. 一个类只能定义一个静态构造函数(也即静态构造函数不能被重载)
  2. 静态构造函数不允许访问修饰符且不接受任何参数
  3. 静态构造函数永远只执行一次
  4. (运行库)创建类的实例或首次访问静态成员前调用静态构造函数
  5. 静态构造函数的执行优先于任何实例级别的构造函数

静态类

若用static关键字修饰一个类,则其被声明为静态类,其将不能通过new关键字来创建对象实例。一般想要设计一个“工具类”时才会将一个类声明为静态类————我们使用这个类只是为了使用其中的方法/属性,而不需要创建一个具体的对象。 .NET平台下的system命名空间中常用的静态类(工具类)有:

  • Math 数学计算相关函数
  • GC 垃圾回收
  • Console 控制台应用
  • Enviroment 系统环境及平台信息
  • Convert 类型转换
  • Buffer 基元类型数组
  • BitConverter 数据与字节数组转换
  • Nullable 返回值可为null的值类型

static关键字相关的还有const关键字和readonly关键字

Keyword: const

const 关键字修饰的数据为常量数据,其值在赋初值后永远不变。在类中的常量字段是隐式静态的,访问时需加上完全类名前缀。常量数据必须在编译时确定其值。

在定义常量数据时必须对其赋初值,其他任何地方,包括构造函数,都不能对之进行写操作(构造函数在运行时才调用)。

Keyword: readonly

与常量数据相似的,用readonly关键字修饰的数据称为只读数据/字段,其在定义赋初值后同样不能被修改。但与常量数据不同,其值可在运行时确定,故其可在构造函数内赋初值(当然,其他地方依然不行)。只读字段不是隐式静态的。

静态只读字段

要将只读字段变为静态只需用static修饰,将其变为静态只读字段。静态只读字段将在类级别公开只读字段。在编译时已知静态只读字段,则其使用方式和常量字段相同;如其在运行时才能确定其值,则要用静态构造函数。