ASP.NET网站制作之C#体验编程手艺 类与工具
有理由相信是能提供更出色的性能。很多平台无法支持复杂的编译器,因此需要二次编译来减少本地编译器的复杂度。当然可能做不到java编译器那么简易。编程|工具 组件编程不是对传统面向工具的丢弃,相反组件编程恰是面向工具编程的深化和开展。类作为面向工具的魂灵在C#言语里有着相称普遍深切的使用,良多十分“Sharp”的组件特征乃至都是间接由类包装而成。对类的深度把握天然是我们“SharpXP”主要的一环。<P>类<P> C#的类是一种对包含数据成员,函数成员和嵌套范例举行封装的数据布局。个中数据成员能够是常量,域。函数成员能够是办法,属性,索引器,事务,操纵符,实例构建器,静态构建器,析构器。我们将在“第五讲机关器与析构器”和“第六讲域办法属性与索引器”对这些成员及其特征作具体的分析。除某些导进的内部办法,类及其成员在C#中的声明和完成一般要放在一同。<P> C#用多种润色符来表达类的分歧性子。依据其回护级C#的类有五种分歧的限定润色符:[*]public能够被恣意存取;
[*]protected只能够被本类和其承继子类存取;
[*]internal只能够被本组合体(Assembly)内一切的类存取,组合体是C#言语中类被组合后的逻辑单元和物理单元,其编译后的文件扩大名常常是“.DLL”或“.EXE”。
[*]protectedinternal独一的一种组合限定润色符,它只能够被本组合体内一切的类和这些类的承继子类所存取。
[*]private只能够被本类所存取。
<P> 假如不是嵌套的类,定名空间或编译单位内的类只要public和internal两种润色。<P> new润色符只能用于嵌套的类,暗示对承继父类同名范例的埋没。<P> abstract用来润色笼统类,暗示该类只能作为父类被用于承继,而不克不及举行工具实例化。笼统类能够包括笼统的成员,但这并不是必需。abstract不克不及和new同时用。上面是笼统类用法的伪码:abstractclassA{publicabstractvoidF();}abstractclassB:A{publicvoidG(){}}classC:B{publicoverridevoidF(){//办法F的完成}}<P> 笼统类A内含一个笼统办法F(),它不克不及被实例化。类B承继自类A,其内包括了一个实例办法G(),但并没有完成笼统办法F(),以是仍旧必需声明为笼统类。类C承继自类B,完成类笼统办法F(),因而能够举行工具实例化。<P> sealed用来润色类为密封类,制止该类被承继。同时对一个类作abstract和sealed的润色是没成心义的,也是被克制的。<P>工具与this关头字<P> 类与工具的辨别对我们掌控OO编程相当主要。我们说类是对其成员的一种封装,但类的封装计划仅仅是我们编程的第一步,对类举行工具实例化,并在其数据成员上实行操纵才是我们完成实际义务的基本。实例化工具接纳MyClassmyObject=newMyClass()语法,这里的new语义将挪用响应的构建器。C#一切的工具都将创立在托管堆上。实例化后的范例我们称之为工具,其中心特性即是具有了一份本人独有的数据成员拷贝。这些为独有的工具所持有的数据成员我们称之为实例成员。相反那些不为独有的工具所持有的数据成员我们称之为静态成员,在类顶用static润色符声明。仅对静态数据成员实行操纵的称为静态函数成员。C#中静态数据成员和函数成员只能经由过程类名援用猎取,看上面的代码:usingSystem;classA{publicintcount;publicvoidF(){Console.WriteLine(this.count);}publicstaticstringname;publicstaticvoidG(){Console.WriteLine(name);}}classTest{publicstaticvoidMain(){Aa1=newA();Aa2=newA();a1.F();a1.count=1;a2.F();a2.count=2;A.name="CCW";A.G();}}<P> 我们声了然两个A工具a1,a2。关于实例成员count和F(),我们只能经由过程a1,a2援用。关于静态成员name和G()我们只能经由过程范例A来援用,而不成以如许a1.name,或a1.G()。<P> 在下面的程序中,我们看到在实例办法F()中我们才用this来援用变量count。这里的this是甚么意义呢?this关头字援用以后工具实例的成员。在实例办法体内我们也能够省略this,间接援用count,实践上二者的语义不异。天经地义的,静态成员函数没有this指针。this关头字一样平常用于从机关函数、实例办法和实例会见器中会见成员。<P>在机关函数中this用于限制被不异的称号埋没的成员,比方:classEmployee{publicEmployee(stringname,stringalias){this.name=name;this.alias=alias;}}<P> 将工具作为参数传送到其他办法时也要用this表达,比方:CalcTax(this);<P> 声明索引器时this更是不成或缺,比方:publicintthis{get{returnarray;}set{array=value;}}<P>System.Object类<P> C#中一切的类都间接或直接承继自System.Object类,这使得C#中的类得以单根承继。假如我们没有明白指定承继类,编译器缺省以为该类承继自System.Object类。System.Object类也可用小写的object关头字暗示,二者完整同等。天然C#中一切的类都承继了System.Object类的大众接口,分析它们对我们了解并把握C#中类的举动十分主要。上面是仅用接口情势暗示的System.Object类:namespaceSystem{publicclassObject{publicstaticboolEquals(objectobjA,objectobjB){}publicstaticboolReferenceEquals(objectobjA,objectobjB){}publicObject(){}publicvirtualboolEquals(objectobj){}publicvirtualintGetHashCode(){}publicTypeGetType(){}publicvirtualstringToString(){}protectedvirtualvoidFinalize(){}protectedobjectMemberwiseClone(){}}<P> 我们先看object的两个静态办法Equals(objectobjA,objectobjB),ReferenceEquals(objectobjA,objectobjB)和一个实例办法Equals(objectobj)。在我们论述这两个办法之前我们起首要分明面向工具编程两个主要的相称观点:值相称和援用相称。值相称的意义是它们的数据成员按内存位分离相称。援用相称则是指它们指向统一个内存地点,大概说它们的工具句柄相称。援用相称一定推出值相称。关于值范例干系等号“==”判别二者是不是值相称(布局范例和列举范例没有界说干系等号“==”,我们必需本人界说)。关于援用范例干系等号“==”判别二者是不是援用相称。值范例在C#里一般没有援用相称的暗示,只要在非托管编程中接纳取地点符“&”来直接判别两者的地点是不是相称。<P> 静态办法Equals(objectobjA,objectobjB)起首反省两个工具objA和objB是不是都为null,假如是则前往true,不然举行objA.Equals(objB)挪用并前往其值。成绩回结到实例办法Equals(objectobj)。该办法缺省的完成实在就是{returnthis==obj;}也就是判别两个工具是不是援用相称。但我们注重到该办法是一个虚办法,C#保举我们重写此办法来判别两个工具是不是值相称。实践上Microsoft.NET框架类库内供应的很多范例都重写了该办法,如:System.String(string),System.Int32(int)等,但也有些范例并没有重写该办法如:System.Array等,我们在利用时必定要注重。关于援用范例,假如没有重写实例办法Equals(objectobj),我们对它的挪用相称于this==obj,即援用相称判别。一切的值范例(隐含承继自System.ValueType类)都重写了实例办法Equals(objectobj)来判别是不是值相称。<P> 注重关于工具x,x.Equals(null)前往false,这里x明显不克不及为null(不然不克不及完成Equals()挪用,体系抛出空援用毛病)。从这里我们也可看出计划静态办法Equals(objectobjA,objectobjB)的缘故原由了--假如两个工具objA和objB都大概为null,我们便只能用object.Equals(objectobjA,objectobjB)来判别它们是不是值相称了--固然假如我们没有改写实例办法Equals(objectobj),我们失掉的还是援用相称的了局。我们能够完成接口IComparable(有关接口我们将在“第七讲接口承继与多态”里论述)来强迫改写实例办法Equals(objectobj)。<P> 关于值范例,实例办法Equals(objectobj)应当和干系等号“==”的前往值分歧,也就是说假如我们重写了实例办法Equals(objectobj),我们也应当重载或界说干系等号“==”操纵符,反之亦然。固然值范例(承继自System.ValueType类)都重写了实例办法Equals(objectobj),但C#保举我们重写本人的值范例的实例办法Equals(objectobj),由于体系的System.ValueType类重写的很低效。关于援用范例我们应当重写实例办法Equals(objectobj)来表达值相称,一样平常不该该重载干系等号“==”操纵符,由于它的缺省语义是判别援用相称。<P> 静态办法ReferenceEquals(objectobjA,objectobjB)判别两个工具是不是援用相称。假如两个工具为援用范例,那末它的语义和没有重载的干系等号“==”操纵符不异。假如两个工具为值范例,那末它的前往值必定是false。<P> 实例办法GetHashCode()为响应的范例供应哈希(hash)码值,使用于哈希算法或哈希表中。必要注重的是假如我们重写了某范例的实例办法Equals(objectobj),我们也应当重写实例办法GetHashCode()--这理所应该,两个工具的值相称,它们的哈希码也应当相称。上面的代码是对后面几个办法的一个很好的示例:usingSystem;structA{publicintcount;}classB{publicintnumber;}classC{publicintinteger=0;publicoverrideboolEquals(objectobj){Cc=objasC;if(c!=null)returnthis.integer==c.integer;elsereturnfalse;}publicoverrideintGetHashCode(){return2^integer;}}classTest{publicstaticvoidMain(){Aa1,a2;a1.count=10;a2=a1;//Console.Write(a1==a2);没有界说“==”操纵符Console.Write(a1.Equals(a2));//TrueConsole.WriteLine(object.ReferenceEquals(a1,a2));//FalseBb1=newB();Bb2=newB();b1.number=10;b2.number=10;Console.Write(b1==b2);//FalseConsole.Write(b1.Equals(b2));//FalseConsole.WriteLine(object.ReferenceEquals(b1,b2));//Falseb2=b1;Console.Write(b1==b2);//TrueConsole.Write(b1.Equals(b2));//TrueConsole.WriteLine(object.ReferenceEquals(b1,b2));//TrueCc1=newC();Cc2=newC();c1.integer=10;c2.integer=10;Console.Write(c1==c2);//FalseConsole.Write(c1.Equals(c2));//TrueConsole.WriteLine(object.ReferenceEquals(c1,c2));//Falsec2=c1;Console.Write(c1==c2);//TrueConsole.Write(c1.Equals(c2));//TrueConsole.WriteLine(object.ReferenceEquals(c1,c2));//True}}<P> 如我们所希冀,编译程序并运转我们会失掉以下输入:
TrueFalse
FalseFalseFalse
TrueTrueTrue
FalseTrueFalse
TrueTrueTrue
<P> 实例办法GetType()与typeof的语义不异,它们都经由过程查询工具的元数据来断定工具的运转时范例,我们在“第十讲特性与映照”对此作具体的论述。<P> 实例办法ToString()前往工具的字符串表达情势。假如我们没有重写该办法,体系一样平常将范例名作为字符串前往。<P> 受回护的Finalize()办法在C#中有特别的语义,我们将在“第五讲机关器与析构器”里具体论述。<P> 受回护的MemberwiseClone()办法前往今朝工具的一个“影子拷贝”,该办法不克不及被子类重写。“影子拷贝”仅仅是工具的一份按位拷贝,其寄义是对工具内的值范例变量举行赋值拷贝,对其内的援用范例变量举行句柄拷贝,也就是拷贝后的援用变量将持有对统一块内存的援用。相对“影子拷贝”的是深度拷贝,它对援用范例的变量举行的是值复制,而非句柄复制。比方X是一个含有工具A,B援用的工具,而工具A又含有工具M的援用。Y是X的一个“影子拷贝”。那末Y将具有一样的A,B的援用。但关于X的一个“深度拷贝”Z来讲,它将具有工具C和D的援用,和一个直接的工具N的援用,个中C是A的一份拷贝,D是B的一份拷贝,N是M的一份拷贝。深度拷贝在C#里经由过程完成ICloneable接口(供应Clone()办法)来完成。 对工具和System.Object的掌控为类的进修作了一个很好的展垫,但这仅仅是我们锋利之行的一小步,关乎工具成员初始化,内存援用的开释,承继与多态,非常处置等等诸多“Sharp”绝技堪为众多,让我们持续等候上面的专题!
Java欺骗了我们那么多年,如今的多核时代,我认为它气数已尽! 最强的技术支持WebService,而且有.NET的所有library做后盾。而且ASP.NET在.NET3.5中还有微软专门为AJAX开发的功能--ASP.NETAJAX。 asp.net最主要特性包括:◆编程代码更简洁◆网站可实现的功能更强大◆运行效率高◆节省服务器的动作资源 我觉得什么语言,精通就好,你要做的就是比其他80%的人都厉害,你就能得到只有20%的人才能得到的高薪。 可以看作是VC和Java的混合体吧,尽管MS自己讲C#内核中更多的象VC,但实际上我还是认为它和Java更象一些吧。首先它是面向对象的编程语言,而不是一种脚本,所以它具有面向对象编程语言的一切特性。 可以看作是VC和Java的混合体吧,尽管MS自己讲C#内核中更多的象VC,但实际上我还是认为它和Java更象一些吧。首先它是面向对象的编程语言,而不是一种脚本,所以它具有面向对象编程语言的一切特性。 PHP的源代码完全公开,在OpenSource意识抬头的今天,它更是这方面的中流砥柱。不断地有新的函数库加入,以及不停地更新,使得PHP无论在UNIX或是Win32的平台上都可以有更多新的功能。它提供丰富的函数,使得在程式设计方面有着更好的资源。目前PHP的最新版本为4.1.1,它可以在Win32以及UNIX/Linux等几乎所有的平台上良好工作。PHP在4.0版后使用了全新的Zend引擎,其在最佳化之后的效率,比较传统CGI或者ASP等技术有了更好的表现。 CGI程序在运行的时候,首先是客户向服务器上的CGI程序发送一个请求,服务器接收到客户的请求后,就会打开一个新的Process(进程)来执行CGI程序,处理客户的请求。CGI程序最后将执行的结果(HTML页面代码)传回给客户。
页:
[1]