C#静态类(staticclass)
静态类
静态类与⾮静态类的重要区别在于静态类不能实例化,也就是说,不能使⽤ new 关键字创建静态类类型的变量。在声明⼀个类时使⽤静态类与⾮静态类的重要区别在于静态类不能实例化
static关键字,具有两个⽅⾯的意义:⾸先,它防⽌程序员写代码来实例化该静态类;其次,它防⽌在类的内部声明任何实例字段或⽅法。静态类是⾃C# 2.0才引⼊的,C# 1.0不⽀持静态类声明
不⽀持静态类声明。程序员必须声明⼀个私有构造器。私有构造器禁⽌开发者在类的范围之外实例化类的实例。使⽤私有构造器的效果与使⽤静态类的效果⾮常相似。两者的区别在于,私有构造器⽅式仍然可以从类的内部对类进⾏实例化,⽽静态类禁⽌从任何地⽅实例化类,其中包括从类⾃⾝内部。静态类和使⽤私有构造器的另⼀个区别在于,在使⽤私有构造器的类中,是允许有实例成员的,⽽C# 2.0和更⾼版本的编译器不允许静态类有任何实例成员。使⽤静态类的优点在于,编译器能够执⾏检查以确保不致偶然地添加实例成员,编译器将保证不会创建此类的实例。
保不致偶然地添加实例成员,编译器将保证不会创建此类的实例。静态类的另⼀个特征在于,C#编译器会⾃动把它标记为sealed。这个关键字将类指定为不可扩展;换⾔之,不能从它派⽣出其他类。
静态类的主要特性:
1:仅包含静态成员。
2:⽆法实例化。
3:是密封的。
4:不能包含实例构造函数。
静态成员
1:⾮静态类可以包含静态的⽅法、字段、属性或事件;
2:⽆论对⼀个类创建多少个实例,它的静态成员都只有⼀个副本;
3:静态⽅法和属性不能访问其包含类型中的⾮静态字段和事件,并且不能访问任何对象的实例变量;
4:静态⽅法只能被重载,⽽不能被重写,因为静态⽅法不属于类的实例成员;
5:虽然字段不能声明为 static const,但const 字段的⾏为在本质上是静态的。这样的字段属于类,
不属于类的实例。因此,可以同对待静态字段⼀样使⽤ ClassName.MemberName 表⽰法来访问 const 字段;6:C# 不⽀持静态局部变量(在⽅法内部定义静态变量)。
静态构造函数
1:静态类可以有静态构造函数,静态构造函数不可继承;
实例化类和实例化对象2:静态构造函数可以⽤于静态类,也可⽤于⾮静态类;
3:静态构造函数⽆访问修饰符、⽆参数,只有⼀个 static 标志;
4:静态构造函数不可被直接调⽤,当创建类实例或引⽤任何静态成员之前,静态构造函数被⾃动执⾏,并且
只执⾏⼀次。
注意:
1:静态类在内存中是⼀直有位置的;
2:⾮静态类在实例化后是在内存中是独⽴的,它的变量不会重复,在使⽤后会及时销毁,所以不会出
现未知
的错误。在C#中静态成员是⽐较敏感的东西,在不是⼗分确认的情况下不要使⽤;
3:建议更多地使⽤⼀般类(⾮静态类)。
使⽤选择:
当定义的类不需要进⾏实例化时,我们使⽤静态类;如果需要实例化对象,需要继承等特性时,应该使⽤⾮静态类,并且将统⼀使⽤的变量和⽅法设为静态的,那么所有实例对象都能访问。
类可以声明为 static 的,以指⽰它仅包含静态成员。
静态类在加载包含该类的程序或命名空间时,由 .NET Framework 公共语⾔运⾏库 (CLR;特指:C#语⾔) ⾃动加载。
使⽤静态类来包含不与特定对象关联的⽅法,具有通⽤性
注意事项:
(1) 不能使⽤ new 关键字创建静态类的实例;
(2) 仅包含静态成员;
(3) 不能被实例化;
(4) 密封的,不能被继承;
(5) 不能包含实例构造函数,但可以包含静态构造函数;
关于静态构造函数的补充:
(1) 静态构造函数不可继承;
(2) 静态构造函数可以⽤于静态类,也可⽤于⾮静态类;
(3) 静态构造函数⽆访问修饰符、⽆参数,只有⼀个 static 标志;
(4) 静态构造函数不可被直接调⽤,当创建类实例或引⽤任何静态成员之前,静态构造函数被⾃动执⾏,并且只执⾏⼀次。实例分析:
刚开始对静态类不太熟悉,所以写出了如下的代码:
在主函数中调⽤ClassA的静态⽅法:
最终的输出结果为:5
原因分析:
虽然有实例构造函数,但对classA类没有进⾏实例化,所以该实例构造函数没有被调⽤;
主函数代码修改如下:
输出结果为:15
如果类不声明为静态类(static class),很容易出现类似于上⾯的错误。修改为静态类,代码如下:
主函数代码如下:
由于静态构造函数会在调⽤静态类的⽅法时⾃动调⽤,所以最终输出结果正确!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论