static关键字
使用static修饰符能够声明属于类型本身而不属于特定对象的静态成员,static修饰符可以用于类、方法、属性、字段、运算符、事件和构造函数,但是不能用于析构函数、索引器或者类以外的类型。
静态类
静态类和非静态类的基本相同,但是和非静态类的一个显著的区别是,静态类不能够使用new关键字实例化,因为静态类是默认密封的(sealed)。在引用静态类的成员时,无法使用实例变量,必须要通过类名本身访问静态类的成员,例如,如果名为UtilityClass 的静态类有一个名为 MethodA 的公共方法,则按下面的示例所示调用该方法:
UtilityClass.MethodA(); //使用静态类的类名本身使用Method方法
静态类的运用场景:
只需要输入参数或者无参数进行计算的方法集,而又不需要获取方法集任何内部字段和属性,应该考虑使用静态类作为这些方法集的容器。也就是说,只要不涉及到获取或者更改方法集内部的属性和字段,仅使用这个方法集获得一个结果或者更改一个状态,那么就可以把这些方法集放到静态类中。
例如,在 .NET Framework 类库中,静态类 System.Math 包含的方法只执行数学运算,而无需存储或检索特定 Math 类实例特有的数据。 就是说,通过指定类名称和方法名称来应用类成员,如下示例所述。
double dub = -3.14;
Console.WriteLine(Math.Abs(dub));
Console.WriteLine(Math.Floor(dub));
Console.WriteLine(Math.Round(Math.Abs(dub))); //传入一个值,获取一个结果,不涉及内部的任何字段和属性
和所有类类型一样,当加载引用静态类的程序时,.NET Framework 公共语言运行时 (CLR) 将加载该静态类的类型信息。程序不能指定加载静态类的确切时间。 但是,可以保证在程序中首次引用该类前加载该类,并初始化该类的字段并调用其静态构造函数。静态构造函数仅调用一次,在程序驻留的应用程序域的生存期内,静态类一直保留在内存中。
静态类的主要特性:
- 仅仅包含静态成员(包括方法、字段、属性和事件)
- 静态类不能够被继承,默认是密封sealed的,因此无法实例化
- 静态类不能够包含实例构造函数,既是如果不重载静态类的构造函数,那么默认的构造函数也是静态的,如果重载了构造函数,必须在构造函数前加限定修饰符static
例子1:摄氏温度和华氏温度的转换
public static class TemperatureConverter
{
public static double CelsiusToFahrenheit(string temperatureCelsius)
{
// 将string转换成double类型的数据
double celsius = Double.Parse(temperatureCelsius);
// 将摄氏温度转换成华氏温度
double fahrenheit = (celsius * 9 / 5) + 32;
return fahrenheit;
}
public static double FahrenheitToCelsius(string temperatureFahrenheit)
{
// 将string转换成double类型的数据
double fahrenheit = Double.Parse(temperatureFahrenheit);
//华氏温度转换成摄氏温度
double celsius = (fahrenheit - 32) * 5 / 9;
return celsius;
}
}
class TestTemperatureConverter
{
static void Main()
{
Console.WriteLine("请输入转换的方向");
Console.WriteLine("1. 从摄氏温度转换成华氏温度.");
Console.WriteLine("2. 从华氏温度转换成.");
Console.Write(":");
string selection = Console.ReadLine();
double F, C = 0;
switch (selection)
{
case "1":
Console.Write("Please enter the Celsius temperature: ");
F = TemperatureConverter.CelsiusToFahrenheit(Console.ReadLine());
Console.WriteLine("Temperature in Fahrenheit: {0:F2}", F);
break;
case "2":
Console.Write("Please enter the Fahrenheit temperature: ");
C = TemperatureConverter.FahrenheitToCelsius(Console.ReadLine());
Console.WriteLine("Temperature in Celsius: {0:F2}", C);
break;
default:
Console.WriteLine("Please select a convertor.");
break;
}
// 保持窗口打开
Console.WriteLine("Press any key to exit.");
Console.ReadKey();
}
}
静态成员
非静态类可以包含静态成员,包括静态方法,字段,属性和事件,调用非静态类的静态成员,可使用非静态类名访问,而不能通过非静态类的实例名来调用。 一般认为非静态类的静态成员属于类本身,而不属于类的特定实例,无论一个类有多少个实例,它的静态成员都只有一个副本。
静态方法和事件不能够访问所在非静态类的非静态字段和事件,并且不能访问任何对象的实例变量,只能够访问静态字段。
更常见的做法是将类中的一些成员设置成静态成员,而不是将整个类设置成为静态类,
静态字段的常见用法是:
- 记录已经被实例化的对象的个数。
- 存储必须在所有的实例中共享的值
虽然字段不能声明为 static const,但 const 字段的行为在本质上是静态的。 这样的字段属于类型,不属于类型的实例。 因此,可以同对待静态字段一样使用 ClassName.MemberName 表示法来访问 const 字段。 不需要对象实例。
public class Automobile
{
public static int NumberOfWheels = 4; //静态字段
public static int SizeOfGasTank //静态属性 在类型前加上static关键字
{
get
{
return 15;
}
}
public static void Drive() { } //静态方法
public static event EventType RunOutOfGas; //静态事件
}
访问非静态类的静态成员实例:
Automobile.Drive(); //调用非静态类的静态方法,直接使用类名,而不是实例名
int i = Automobile.NumberOfWheels; //调用静态字段
本文详细介绍了C#中的静态类与静态成员的概念、特点及应用场景,包括如何使用static关键字声明静态成员,以及静态类的限制和优势。同时,通过实例展示了静态类在温度转换等实用场景中的具体应用。
1006

被折叠的 条评论
为什么被折叠?



