静态类和非静态类以及静态方法和非静态方法的区别
1、静态类中不能包括非静态成员,比如非静态方法、构造函数;非静态类中可以包括静态成员。如果不按照这种规则静态类编译器会检查报错。
简而言之就是:静态类中所有的成员必须是静态成员,但是静态成员不一定是在静态类中 。
2、静态类无法实例化,其成员可以直接使用;非静态类中的静态成员不需要实例化,可以直接使用,非静态类中的非静态成员必须实例化。
简而言之就是:不管在哪静态成员都不需要实例化其所在类,而非静态成员必须实例化其所在类。
3、静态成员之所以执行速度快,是因为其在编译的时候编译器放在了静态区(保存自动全局变量和 static 变量)静态区的内容在总个程序的生命周期内都存在,而普通类的中的非静态成员需要实例化,值类型在栈中分配空间,引用类型在栈中存引用地址,堆中存实例对象,从而获取方法,所以速度慢。
静态成员变量在程序启动的时候,就全部装入内存的静态区中,而不管这些方法、属性以后有没有用到
。即使是没有人再访问程序,这部分内存仍然不会释放。
4、静态成员等同于全局变量,整个系统中存在统一块区域(静态区)中,是共享的,比如static into num=0;编译的时候num就已经是0了,A线程改了其值为1,B线程获取的时候num就是1了。
5、静态方法和属性不能访问其包含类中的非静态字段和事件。静态方法不能直接访问其所在类的其它非静态方法,需要通过实例化的对象引用。非静态方法既可以访问非静态成员,也能访问静态成员。
6、静态方法只能被重载,而不能被重写,因为静态方法不属于类的实例成员。
7、C# 不支持静态局部变量(在方法内部定义静态变量)。
8、静态类是密封类(sealed),无法被继承。其密封是有自我保护的作用,并且符合编程三大思想之封装思想,string也是密封类
9、静态类只能继承object类,不能继承其它类。
10、继承(多态)与静态本身就是相反的,静态类的本质:abstract+sealed。
静态构造函数是C#的一个新特性,其实好像很少用到。不过当我们想初始化一些静态变量的时候就需要用到它了。这个构造函数是属于类的,而不是属于哪里实例的,就是说这个构造函数只会被执行一次。也就是在创建第一个实例或引用任何静态成员之前,由.NET自动调用。
{
// Static constructor
static SimpleClass()
{
//
}
}
在使用静态构造函数的时候应该注意几点:
1、静态构造函数既没有访问修饰符,也没有参数。因为是.NET调用的,所以像public和private等修饰符就没有意义了。
2、是在创建第一个类实例或任何静态成员被引用时,.NET将自动调用静态构造函数来初始化类,也就是说我们无法直接调用静态构造函数,也就无法控制什么时候执行静态构造函数了。
3、一个类只能有一个静态构造函数。
4、无参数的构造函数可以与静态构造函数共存。尽管参数列表相同,但一个属于类,一个属于实例,所以不会冲突。
5、最多只运行一次。
6、静态构造函数不可以被继承。
7、如果没有写静态构造函数,而类中包含带有初始值设定的静态成员,那么编译器会自动生成默认的静态构造函数。