C#中提供了一些纯静态的类,比如说System.Math、System.Console,这种类一般提供的是不会发生变化的数据和行为,他们不会依赖于任何的对象,全表现为静态成员。这些数据和行为,可以直接通过“类名.数据”或是“类名.行为”进行调用,不需要实例化(静态类也不允许实例化)。
静态类声明为static,只能包含静态成员,不能通过new进行实例化,是密封的不能被继承,不能包含实例构造函数,可以包含静态构造函数。静态类在加载时由 .NET Framework 公共语言运行库 (CLR) 自动加载。
下面提供一个实例,其中test静态类完成的是根据半径计算圆的面积(通过静态函数成员实现),同时其中也存储了PI的值(通过静态数据成员实现),PI在静态构造函数中进行了初始化,当然也可以在定义的时候就完成初始化工作。
- using System;
- using System.Collections.Generic;
- using System.Text;
- namespace StaticTest
- {
- class Program
- {
- static void Main(string[] args)
- {
- Console.WriteLine("圆的面积是:{0}",test.GetCirleArea(4.5));
- }
- }
- public static class test //通过static声明test为静态类
- {
- static double PI;//声明静态数据成员(PI)
- static test()//可以在静态类中加入构造函数对静态成员进行初始化
- {
- PI = 3.14159;//在静态构造函数中初始化静态数据成员
- }
- public static double GetCirleArea(double r)//声明静态函数成员(通过半径计算圆的面积)
- {
- return PI * r * r;
- }
- }
- }
把类声明为static,主要有两方面的作用:一是防止通过代码来实例化一个类;二是防止在类的内部声明任何实例成员(包括字段、属性或方法)。
静态类在CIL将标记为abstract和sealed,表明其是不可扩展的,即不能通过它派生出其他类,也不能通过“扩展方法”对此类进行扩展。