10.10 静态类

迄今为止,我们学习了静态方法、静态字段,当我们在声明类时使用static修饰符,所声明的类就称做静态类。静态类具有如下特征:

❑静态类不能使用sealed或abstract修饰符;

❑静态类必须直接继承自System.Object类型,不能是任何其他类的派生类;

❑静态类不能实现任何接口;

❑静态类不能包含任何操作符;

❑静态类不能包含使用protected或者protected internal修饰的静态成员;

❑静态类只能包含静态成员;

❑静态类可以包含静态构造函数,但不能包含实例构造函数;

❑静态类不能被实例化;

❑静态类是密封的,不能被继承;

静态类仅包含静态成员,不能使用new关键字创建静态类的实例。静态类在加载包含该类的程序集时由CLR自动加载。正是因为静态类不包括实例字段,因此它不可以包含与特定实例相关联的数据。在实际工作中,创建一组不操作实例数据并且不与代码中的特定对象关联的方法是很常见的需求。.NET FRAMEWORK类库中的System.Math就是一个静态类,其提供了三角函数、对数函数和其他通用数学函数的常数(如π)和静态方法。

下面来看一个实例,这是一个摄氏度/华氏度转换的工具类,功能就是提供华氏度到摄氏度的转换(以及相反过程)。如代码清单10-13所示。

代码清单10-13 摄氏度/华氏度转换工具类


///<summary>

///温度转换

///</summary>

public static class TemperatureConverterUtils

{

///<summary>

///摄氏度转成华氏度

///</summary>

///<param name="temperatureCelsius"></param>

///<returns></returns>

public static double CelsiusToFahrenheit(string temperatureCelsius)

{

double celsius=Double.Parse(temperatureCelsius);

//转换摄氏度到华氏度

double fahrenheit=(celsius*9/5)+32;

return fahrenheit;

}

///<summary>

///华氏度转摄氏度

///</summary>

///<param name="temperatureFahrenheit"></param>

///<returns></returns>

public static double FahrenheitToCelsius(string temperatureFahrenheit)

{

double fahrenheit=Double.Parse(temperatureFahrenheit);

//华氏度到摄氏度转换

double celsius=(fahrenheit-32)*5/9;

return celsius;

}

}


我们再从IL的角度观察这段代码编译后的结果,可以看出,编译器将类标记为abstract和sealed,并且没有实例构造函数(即:IL中没有.ctor方法),如图10-7所示。

10.10 静态类 - 图1

图 10-7 TemperatureConverterUtils类编译后的IL结构