静态类和类成员用于创建无需创建类的实例就能够访问的数据和函数。静态类成员可用于分离独立于任何对象标识的数据和行为:无论对象发生什么更改,这些数据和函数都不会随之变化。当类中没有依赖对象标识的数据或行为时,就可以使用静态类。
类可以声明为 static 的,以指示它仅包含静态成员。不能使用 new 关键字创建静态类的实例。静态类在加载包含该类的程序或命名空间时由 .NET Framework 公共语言运行库 (CLR) 自动加载。
使用静态类来包含不与特定对象关联的方法。例如,创建一组不操作实例数据并且不与代码中的特定对象关联的方法是很常见的要求。您应该使用静态类来包含那些方法。
结构(值类型)不能用static来修饰,因为CLR要求值类型是必须实例化的。
静态类的主要功能如下:
-
它们仅包含静态成员。
-
它们不能被实例化。
-
它们是密封的。
-
它们不能包含实例构造函数(私有的实例构造函数也不行,但可以有静态构造函数)。
使用静态类的优点在于,编译器能够执行检查以确保不致偶然地添加实例成员。编译器将保证不会创建此类的实利。
静态类是密封的,因此不可被继承。静态类不能包含构造函数,但仍可声明静态构造函数以分配初始值或设置某个静态状态。
静态类的特点:
(1)必须直接从基类System.Object派生,因为从其它基类派生的类由于继承性仅适用于对象而没有任何意义,而且不能创建静态类的实例
(2)不能实现任何接口,因为只有使用类的实例才能去调用类的接口方法,而静态类不能被实例化
(3)静态类只能定义静态成员(字段、方法、属性、事件)
(4)静态类不能被用作字段、方法参数或局部变量,因为这些用法都将表明变量引用了实例
(5)静态类不能使用abstract或sealed修饰符。
(6)静态类的成员不能有protected或protected internal访问保护修饰符,都为public。
(7)静态类可以有静态构造函数,静态构造函数不可继承。 静态构造函数无访问修饰符、无参数(CLR调用的函数都模样)。
(8)静态类最主要的一个优点是写在栈中,安全高速稳定,而且在执行的时候,十分优先.
以下为写的一个测试类,含有静态构造函数:
using System; |
using System.Collections.Generic; |
using System.Linq; |
using System.Text; |
namespace StaticClassPractise |
{ |
public static class Demo |
{ |
public static string msg; |
static Demo() |
{ |
msg = "welcome to static class!"; |
} |
public static void showMsg() |
{ |
Console.WriteLine(msg); |
} |
} |
} |
我们来看看反编译后的情况:
.class public abstract auto ansi sealed Demo |
extends [mscorlib]System.Object |
{ |
.method private hidebysig specialname rtspecialname static void .cctor() cil managed |
{ |
.maxstack 8 |
L_0000: nop |
L_0001: ldstr "welcome to static class!" |
L_0006: stsfld string StaticClassPractise.Demo::msg |
L_000b: ret |
} |
.method public hidebysig static void showMsg() cil managed |
{ |
.maxstack 8 |
L_0000: nop |
L_0001: ldsfld string StaticClassPractise.Demo::msg |
L_0006: call void [mscorlib]System.Console::WriteLine(string) |
L_000b: nop |
L_000c: ret |
} |
.field public static string msg |
} |