C#--静态类和静态成员
1.静态类
1.仅包含静态成员。
2.无法实例化。
3.是密封的。
4.不能包含实例构造函数。
2.非静态类
1可以有静态成员
2 静态变量为所有实例类共有。
3静态方法中只能使用静态变量。
不管是静态类还是非静态类都可以用(类名.静态方法)访问,也就是静态方法只能用(类名.静态方法)访问。
静态类和静态成员
静态类与非晶态类基本相同,但存在一个区别:静态类不能实例化。也就是说,不能用new关键字创建静态类类型的变量。因为没有实例变量,所以要使用类名本身访问静态类的成员。
和所有类型一样,当加载引用静态类的成员时,.NET Framework公共语言运行时(CLR)将加载该静态类的类型信息。
程序布恩那个指定加载静态类的确切时间。但是,可以保证在程序中首次引用该类前加载该类,并初始化该类的字段并调用其静态构造函数。
静态构造函数仅调用一次,在程序驻留的应用程序域的生存期内,静态类一直保留在内存中。
对于只输入参数进行运算而不获取或设置任何内部实例字段的方法集,静态类可以方便的使用这些方法集的内容。
静态类的主要特性:
1.仅包含静态成员。
2.无法实例化。
3.是密封的。
4.不能包含实例构造函数。
因此,创建静态类与创建仅包含静态成员和私有构造函数的类基本相同。
私有构造函数阻止类类被实例化。
使用静态类的有点在于:编译器能够执行检查确保不致偶然的添加实例成员。编译器将保证不会创建此类的实例。
静态类是密封的,因此不可被继承。他们不能从除Object外的任何类中继承。
静态类不能包含实例构造函数,但可以包含静态构造函数。如果非静态类包含需要进行重要的初始化静态成员,也应定义静态构造函数。
EXAMPLE
public static class TemperatureConverter
{
public static double CelsiusToFahrenheit(string temperatureCelsius)
{
double celsius = Double.Parse(temperatureCelsius);
double fahrenheit = (celsius * 9 / 5) + 32;
return fahrenheit;
}
public static double FahrenheitToCelsius(string temperatureFahrenheit)
{
double fahrenheit = Double.Parse(temperatureFahrenheit);
double celsius = (fahrenheit - 32) * 5 / 9;
return celsius;
}
}
class TestTemperatureConverter
{
static void Main()
{
Console.WriteLine("1. From Celsius to Fahrenheit.");
Console.WriteLine("2. From Fahrenheit to Celsius.");
Console.Write("Please select the convertor direction:");
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字段,不需要对象实例。
C#不支持静态局部变量(在方法范围内的变量)。
静态成员在第一次被访问之前并且在调用静态构造函数之前进行初始化。若要访问静态类成员,应使用类名而不是实例名称来指定该成员位置。
如果类包含静态字段,应提供在加载类时初始化这些字段的静态构造函数。
对静态方法的调用以Microsoft中间语言(MSIL)生成调用指令,而对实例方法的调用生成callvirt指令,该指令还检查null对象引用。但是,两者之间的性能差异在大多数时候并不明显。