|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
c语言的编译器,几乎是所有新平台都有的。因此从这点上看,c语言的程序,比其他任何语言更加容易跨平台。一.C#机关函数与C#析构函数的道理
作为比C更先辈的言语,C#供应了更好的机制来加强程序的平安性。C#编译用具有严厉的范例平安反省功效,它几近能找出程序中一切的语法成绩,这切实其实帮了程序员的年夜忙。可是程序经由过程了编译反省其实不暗示毛病已不存在了,在“毛病”的小家庭里,“语法毛病”的位置只能算是冰山一角。级别高的毛病一般埋没得很深,不简单发明。
依据履历,很多难以发觉的程序毛病是因为变量没有被准确初始化或扫除酿成的,而初始化和扫除事情很简单被人忘记。微软使用面向对象的观点在计划C#言语时充实思索了这个成绩并很好地予以办理:把对象的初始化事情放在机关函数中,把扫除事情放在析构函数中。当对象被创立时,机关函数被主动实行。当对象灭亡时,析构函数被主动实行。如许就不必忧虑健忘对象的初始化和扫除事情。
二.C#机关函数的使用
机关函数的名字不克不及任意起,必需让编译器认得出才能够被主动实行。它的定名办法既复杂又公道:让机关函数与类同名。除名字外,机关函数的另外一个出格的地方是没有前往值范例,这与前往值范例为void的函数分歧。假如它有前往值范例,那末编译器将手足无措。在你能够会见一个类的办法、属性或任何别的工具之前,第一条实行的语句是包括有响应类的机关函数。乃至你本人不写一个机关函数,也会有一个缺省机关函数供应给你。- classTestClass{publicTestClass():base(){}//由CLR供应}
复制代码 上面枚举了几品种型的机关函数
1)缺省机关函数- classTestClass{publicTestClass():base(){}}
复制代码 下面已先容,它由体系(CLR)供应。
2)实例机关函数
实例机关函数是完成对类中实例举行初始化的办法成员。如:- usingSystem;classPoint{publicdoublex,y;publicPoint(){this.x=0;this.y=0;}publicPoint(doublex,doubley){this.x=x;this.y=y;}…}classTest{staticvoidMain(){Pointa=newPoint();Pointb=newPoint(3,4);//用机关函数初始化对象…}}
复制代码 声了然一个类Point,它供应了两个机关函数。它们是重载的。一个是没有参数的Point机关函数和一个是有两个double参数的Point机关函数。假如类中没有供应这些机关函数,那末会CLR会主动供应一个缺省机关函数的。但一旦类中供应了自界说的机关函数,如Point()和Point(doublex,doubley),则缺省机关函数将不会被供应,这一点要注重。
3)静态机关函数
静态机关函数是完成对一个类举行初始化的办法成员。它一样平常用于对静态数据的初始化。静态机关函数不克不及有参数,不克不及有润色符并且不克不及被挪用,当类被加载时,类的静态机关函数主动被挪用。如:- usingSystem.Data;classEmployee{privatestaticDataSetds;staticEmployee(){ds=newDataSet(...);}...}
复制代码 声了然一个有静态机关函数的类Employee。注重静态机关函数只能对静态数据成员举行初始化,而不克不及对非静态数据成员举行初始化。可是,非静态机关函数既能够对静态数据成员赋值,也能够对非静态数据成员举行初始化。
假如类仅包括静态成员,你能够创立一个private的机关函数:privateTestClass(){…},可是private意味着从类的表面不成能会见该机关函数。以是,它不克不及被挪用,且没有对象能够被该类界说实例化。
以上是几品种型机关函数的复杂使用,上面将重点先容一下在类的条理布局中(即承继布局中)基类和派生类的机关函数的利用体例。派生类对象的初始化由基类和派生类配合完成:基类的成员由基类的机关函数初始化,派生类的成员由派生类的机关函数初始化。
当创立派生类的对象时,体系将会挪用基类的机关函数和派生类的机关函数,构造函数的实行序次是:先实行基类的机关函数,再实行派生类的机关函数。假如派生类又有对象成员,则,先实行基类的机关函数,再实行成员对象类的机关函数,最初实行派生类的机关函数。
至于实行基类的甚么机关函数,缺省情形下是实行基类的无参机关函数,假如要实行基类的有参机关函数,则必需在派生类机关函数的成员初始化表中指出。如:- classA{privateintx;publicA(){x=0;}publicA(inti){x=i;}};classB:A{privateinty;publicB(){y=0;}publicB(inti){y=i;}publicB(inti,intj):A(i){y=j;}};Bb1=newB();//实行基类A的机关函数A(),再实行派生类的机关函数B()Bb2=newB(1);//实行基类A的机关函数A(),再实行派生类的机关函数B(int)Bb3=newB(0,1);//实行实行基类A的机关函数A(int),再实行派生类的
复制代码 机关函数B(int,int)
在这里机关函数的实行序次是必定要剖析分明的。别的,假如基类A中没有供应无参机关函数publicA(){x=0;},则在派生类的一切机关函数成员初始化表中必需指出基类A的有参机关函数A(i),以下所示:- classA{privateintx;publicA(inti){x=i;}};classB:A{privateinty;publicB():A(i){y=0;}publicB(inti):A(i){y=i;}publicB(inti,intj):A(i){y=j;}};
复制代码 三.C#析构函数和渣滓接纳器的使用
析构函数是完成烧毁一个类的实例的办法成员。析构函数不克不及有参数,不克不及任何润色符并且不克不及被挪用。因为析构函数的目标与机关函数的相反,就加前缀‘~’以示区分。
固然C#(更切实的说是CLR)供应了一种新的内存办理机制---主动内存办理机制(Automaticmemorymanagement),资本的开释是能够经由过程“渣滓接纳器”主动完成的,一样平常不必要用户干涉,但在有些特别情形下仍是必要用到析构函数的,如在C#中非托管资本的开释。
资本的开释通常为经由过程"渣滓接纳器"主动完成的,但详细来讲,仍有些必要注重的中央:
1.值范例和援用范例的援用实际上是不必要甚么"渣滓接纳器"来开释内存的,由于当它们出了感化域后会主动开释所占内存,由于它们都保留在栈(Stack)中;
2.只要援用范例的援用所指向的对象实例才保留在堆(Heap)中,而堆由于是一个自在存储空间,以是它并没有像"栈"那样有保存期("栈"的元素弹出后就代表保存期停止,也就代表开释了内存),而且要注重的是,"渣滓接纳器"只对这块地区起感化;
也许唯一可以让世人留恋net网页编程的理由就剩下它的王牌——跨平台。 |
|