学习静态类和静态函数。
这篇博客的内容来自MSDN,当然内容是我自己看MSDN翻译出来的。
正文
静态类和非静态类其实基本相同。两者有一处不同:静态类不能被实例化。换句话来说,你不能够用new去为一个静态类实例出一个对象来。因为静态类中根本没有实例成员。你只能通过使用类名来访问静态类变量。举一个例子:如果你的静态类名叫UtilityClass,而这个类中有个方法叫做MethodA,你只能像下面这样去调用。
UtilityClass.MethodA();
可以把静态类当作一个很方便的容器,存储一组函数,这些函数只是由输入参数来操作,而不需要读写类内的实例feild。例如,在。Net类库中System.Math静态类包含的方法只执行数学计算,而不需要存储和检索Math类实例特有的数据,就是说,你需要通过指定类名和方法名来使用类成员,就像下面的例子展示的那样。
和所有类类型一样,当加载引用静态类的程序时,静态类的类型信息通过公共语言运行时得以加载。程序并不能精确的指定出,这个类何时加载。但是,CLR保证在静态类首次引用前,加载这个类,初始化类的字段并且调用它的构造函数。
以下包含了静态类的主要特性
只包含静态成员
不能被实例化
sealed封闭的
不能包含实例构造函数
因此,创建一个 静态类和创建一个只包含静态成员和私有构造函数的类基本是一样的。私有构造函数方式类实例化。使用静态类的好处是,编译器可以检查确保没有偶然的添加实例成员。编译器会确保不能创建出对象。
静态类是封闭的,因此不能继承。除了Objecet类,它不能继承自其他类。静态类不能包含实例构造函数。但,可以包含静态构造函数。如果非静态类需要初始化重要的静态成员,非静态类也应该定义静态构造函数。
静态成员
非静态类可以包含静态函数,字段,属性和方法。
非静态类可以包含静态方法,字段,属性,事件。即使当类的实例没有创建出来,静态成员也是可以调用的。静态成员是通过类名访问的,而不是对象名。无论创建了多少对象,静态成员只存在一份。静态方法和属性不能访问非静态字段、事件XX,而且他们不能访问任何对象的实例,(除非它在方法参数中显示传递 )。比起去声明一个完全的静态类,声明一个包含静态成员的非静态类更为典型。
去共同维护一个计算实例化类的静态字段,或者存储一个必须共享给所有对象的值。
静态方法可以 重载 ,但 不可以重写,因为它们属于类,不属于任何实例。
虽然字段不能声明为static const,从静态的行为来说,一个const字段本质是静态的。它属于静态类型,而不是实例类型。因此,const字段可以同样通过使用ClassName.MemberName来访问。
C#不支持静态局部变量(声明在方法范围的变量),
在静态成员第一次被访问之前,静态构造器之前,如果调用其中一个静态成员会实例化。
去访问一个静态类成员,要使用类名而不是一个变量名
、如果一个类包含静态字段,你可以写一个静态构造器,当类加载时,构造函数可以初始化他们。
一个静态成员的调用产生了MSIL中的一个调用指令,而一个实例方法的调用产生了一个callvir指令,
然而,大多数时候这两者之间的不同不是那么重要。