6.4 静态类
有一些永远不需要实例化的类,例如Console,Math等。
这些类只有static成员。事实上,这种类的唯一作用就是组合一组相关的成员。
例如Math类就定义了一组执行数学运算的方法。
在C#中,要用static关键字定义不可实例化的类。该关键字只能用于类,不能用于结构(值类型)。
因为CLR总是允许值类型实例化,这是没办法阻止的。
C#编译器对静态类进行了如下限制。
- 静态类必须直接从街垒System.Object派生,从其他任何基类派生都没有意义。继承只适用于对象,而你不能创建静态类的实例。
- 静态类不能实现任何接口,只有使用类的实例时,才可调用类的接口方法。
- 静态类只能定义静态成员(字段,方法,属性,事件),任何实例成员都会导致编译器报错。
- 静态类不能作为字段、方法参数或局部变量使用,因为他们都代表引用了实例的变量,不允许,会报错。
下面是一个定义了静态成员的静态类。代码虽然能通过编译,有一个警告,但该类没有做任何有意义的事情。
public static class AStaticClass { public static void AStaticMethod(){} public static String AStaticProperty() { get{return s_AStaticField;} set{s_AStaticField=value;} } private static String s_AStaticField; public static event EventHandler AStaticEvent; }
使用关键字static定义类,将导致C#编译器将该类标记为abstract和sealed。
此外,编译器不在类型中生成实例构造器方法。