仓酷云
标题:
ASP.NET网页编程之> 第五章 类(rainbow 翻译)*2 (来...
[打印本页]
作者:
愤怒的大鸟
时间:
2015-1-16 22:50
标题:
ASP.NET网页编程之> 第五章 类(rainbow 翻译)*2 (来...
什么叫数据库怎么样?什么意思?你想单学数据库。(其实变成是我问的)5.3类属性
有两种路子展现类的定名属性――经由过程域成员大概经由过程属性。前者是作为具有大众会见性的成员变量而被完成的;后者其实不间接回应存储地位,只是经由过程存取标记(accessors)被会见。
当你想读出或写进属性的值时,存取标记限制了被完成的语句。用于读出属性的值的存取标记记为关头字get,而要修正属性的值的读写符标记记为set。
在你对该实际一孔之见之前,请看一下清单5.9中的例子,属性SquareFeet被标上了get和set的存取标记。
清单5.9完成属性存取标记
1:usingSystem;
2:
3:publicclassHouse
4:{
5:privateintm_nSqFeet;
6:
7:publicintSquareFeet
8:{
9:get{returnm_nSqFeet;}
10:set{m_nSqFeet=value;}
11:}
12:}
13:
14:classTestApp
15:{
16:publicstaticvoidMain()
17:{
18:HousemyHouse=newHouse();
19:myHouse.SquareFeet=250;
20:Console.WriteLine(myHouse.SquareFeet);
21:}
22:}
House类有一个定名为SquareFeet的属性,它能够被读和写。实践的值存储在一个能够从类外部会见的变量中――假如你想看成一个域成员重写它,你所要做的就是疏忽存取标记而把变量从头界说为:
publicintSquareFeet;
关于一个云云复杂的变量,如许不错。可是,假如你想要埋没类外部存储布局的细节时,就应当接纳存取标记。在这类情形下,set存取标记给值参数中的属性传送新值。(能够更名,见第10行。)
除可以埋没完成细节外,你还可自在地限制各类操纵:
get和set:同意对属性举行读写会见。
getonly:只同意读属性的值。
setonly:只同意写属性的值。
除此以外,你能够取得完成在set标记中无效代码的时机。比方,因为各种缘故原由(或基本没有缘故原由),你就可以够回绝一个新值。最好是没有人告知你它是一个静态属性――当你第一次哀求它后,它会保留上去,故要尽量地推延资本分派。
5.4索引
你想过象会见数组那样利用索引会见类吗?利用C#的索引功效,对它的等候即可了却。
语法基础上象如许:
属性润色符声明{声明内容}
详细的例子为
publicstringthis[intnIndex]
{
get{...}
set{...}
}
索引前往或按给出的index设置字符串。它没有属性,但利用了public润色符。声明部分由范例string和this构成用于暗示类的索引。
get和set的实行划定规矩和属性的划定规矩不异。(你不克不及作废个中一个。)只存在一个不同,那就是:你几近能够恣意界说年夜括弧中的参数。限定为,必需最少划定一个参数,同意ref和out润色符。
this关头字确保一个注释。索引没有效户界说的名字,this暗示默许接口的索引。假如类完成了多个接口,你能够增添更多个由InterfaceName.this申明的索引。
为了演示一个索引的利用,我创立了一个小型的类,它可以剖析一个主机名为IP地点――或一个IP地点列表(以http://www.microsoft.com为例)。这个列表经由过程索引能够会见,你能够看一下清单5.10的详细完成。
清单5.10经由过程一个索引猎取一个IP地点
1:usingSystem;
2:usingSystem.Net;
3:
4:classResolveDNS
5:{
6:IPAddress[]m_arrIPs;
7:
8:publicvoidResolve(stringstrHost)
9:{
10:IPHostEntryiphe=DNS.GetHostByName(strHost);
11:m_arrIPs=iphe.AddressList;
12:}
13:
14:publicIPAddressthis[intnIndex]
15:{
16:get
17:{
18:returnm_arrIPs[nIndex];
19:}
20:}
21:
22:publicintCount
23:{
24:get{returnm_arrIPs.Length;}
25:}
26:}
27:
28:classDNSResolverApp
29:{
30:publicstaticvoidMain()
31:{
32:ResolveDNSmyDNSResolver=newResolveDNS();
33:myDNSResolver.Resolve("http://www.microsoft.com");
34:
35:intnCount=myDNSResolver.Count;
36:Console.WriteLine("Found{0}IPsforhostname",nCount);
37:for(inti=0;i<nCount;i++)
38:Console.WriteLine(myDNSResolver[i]);
39:}
40:}
为懂得析主机名,我用到了DNS类,它是System.Net名字空间的一部分。可是,因为这个名字空间其实不包括在中心库中,以是必需在编译命令行中援用该库:
csc/r:System.Net.dll/out:resolver.exednsresolve.cs
剖析代码是向前剖析的。在该Resolve办法中,代码挪用DNS类的静态办法GetHostByName,它前往一个IPHostEntry工具。了局,该工具包括有我要找的数组――AddressList数组。在加入Resolve办法之前,在部分的工具实例成员m_arrIPs中,存储了一个AddressListarray的拷贝(范例IPAddress的工具存储在个中)。
具有如今天生的数组,经由过程利用在类ResolveDNS中求得的索引,使用程序代码就能够在第37至38行枚举出IP地点。(在第6章"把持语句",有更多有关语句的信息。)由于没有举措变动IP地点,以是仅给索引利用了get存取标记。为了复杂其见,我疏忽了数组的界限溢出反省。
5.4事务
当你写一个类时,偶然有需要让类的客户晓得一些已产生的事务。假如你是一个具有多年编程履历的程序员,仿佛有良多的办理举措,包含用于回调的函数指针和用于ActiveX控件的事务吸收(eventsinks)。如今你将要学到别的一种把客户代码联系关系到类关照的举措――利用事务。
事务既能够被声明为类域成员(成员变量),也能够被声明为属性。二者的个性为,事务的范例一定是代表元,而函数指针本相和C#的代表元具有不异的寄义。
每个事务都能够被0或更多的客户占用,且客户能够随时联系关系或作废事务。你能够以静态大概以实例办法界说代表元,尔后者很受C++程序员的接待。
既然我已提到了事务的一切功效及响应的代表元,请看清单5.11中的例子。它活泼地表现了该实际。
清单5.11在类中完成事务处置
1:usingSystem;
2:
3://向前声明
4:publicdelegatevoidEventHandler(stringstrText);
5:
6:classEventSource
7:{
8:publiceventEventHandlerTextOut;
9:
10:publicvoidTriggerEvent()
11:{
12:if(null!=TextOut)TextOut("Eventtriggered");
13:}
14:}
15:
16:classTestApp
17:{
18:publicstaticvoidMain()
19:{
20:EventSourceevsrc=newEventSource();
21:
22:evsrc.TextOut+=newEventHandler(CatchEvent);
23:evsrc.TriggerEvent();
24:
25:evsrc.TextOut-=newEventHandler(CatchEvent);
26:evsrc.TriggerEvent();
27:
28:TestApptheApp=newTestApp();
29:evsrc.TextOut+=newEventHandler(theApp.InstanceCatch);
30:evsrc.TriggerEvent();
31:}
32:
33:publicstaticvoidCatchEvent(stringstrText)
34:{
35:Console.WriteLine(strText);
36:}
37:
38:publicvoidInstanceCatch(stringstrText)
39:{
40:Console.WriteLine("Instance"+strText);
41:}
42:}
第4行声了然代表元(事务办法本相),它用来给第8行中的EventSource类声明TextOut事务域成员。你能够察看到代表元作为一种新的范例声明,当声明事务时可使用代表元。
该类唯一一个办法,它同意我们触发事务。请注重,你必需举行事务域成员不为null的检测,由于大概会呈现没有客户对事务感乐趣这类情形。
TestApp类包括了Main办法,也包括了别的两个办法,它们都具有事务所必须的旌旗灯号。个中一个办法是静态的,而另外一个是实例办法。
EventSource被实例化,而静态办法CatchEvent被预联系关系上了TextOut事务:
evsrc.TextOut+=newEventHandler(CatchEvent);
从如今起,当事务被触发时,该办法被挪用。假如你对事务不再感乐趣,复杂地作废联系关系:
evsrc.TextOut-=newEventHandler(CatchEvent);
注重,你不克不及随便作废联系关系的处置函数――在类代码中仅创立了这些处置函数。为了证实事务处置函数也和实例办法一同事情,余下的代码创建了TestApp的实例,并钩住事务处置办法。
事务在哪方面临你出格有效?你将常常在ASP+中或利用到WFC(WindowsFoundationClasses)时,触及到事务和代表元。
5.5使用润色符
在这一章的进修过程当中,你已见过了象public、virtual等润色符。欲以一种易于了解的办法归纳综合它们,我把它们分别为三节:
。类润色符
。成员润色符
。存取润色符
5.5.1类润色符
到今朝为止,我还没有触及到类润色符,而只触及到了使用于类的存取润色符。可是,有两个润色符你能够用于类:
abstract――关于笼统类的主要一点就是它不克不及被实例化。只要不是笼统的派生类才干被实例化。派生类必需完成笼统基类的一切笼统成员。你不克不及给笼统类利用sealed润色符。
sealed――密封类不克不及被承继。利用该润色符避免不测的承继,在.NET框架中的类用到这个润色符。
要见到两个润色符的使用,看看清单5.12,它创立了一个基于一个笼统类的密封类(一定是一个非常极度的例子)。
清单5.12笼统类和密封类
1:usingSystem;
2:
3:abstractclassAbstractClass
4:{
5:abstractpublicvoidMyMethod();
6:}
7:
8:sealedclassDerivedClass:AbstractClass
9:{
10:publicoverridevoidMyMethod()
11:{
12:Console.WriteLine("sealedclass");
13:}
14:}
15:
16:publicclassTestApp
17:{
18:publicstaticvoidMain()
19:{
20:DerivedClassdc=newDerivedClass();
21:dc.MyMethod();
22:}
23:}
5.5.2成员润色符
与有效的成员润色符的数目比拟,类润色符的数目很少。我已提到了一些,这本书行将呈现的例子形貌了别的的成员润色符。
以下是有效的成员润色符:
abstract――申明一个办法或存取标记不克不及含有一个完成。它们都是隐式假造,且在承继类中,你必需供应override关头字。
const――这个润色符使用于域成员或部分变量。在编译经常量表达式被求值,以是,它不克不及包括变量的援用。
event――界说一个域成员或属性作为范例事务。用于绑缚客户代码到类的事务。
extern――告知编译器办法实践上由内部完成。第10章“和非受管代码相互操纵”将周全地触及到内部代码。
override――用于改写任何基类中被界说为virtual的办法和存取标记。要改写的名字和基类的办法必需分歧。
readonly――一个利用readonly润色符的域成员只能在它的声明大概在包括它的类的机关函数中被变动。
static――被声明为static的成员属于类,而不属于类的实例。你能够用static于域成员、办法、属性、操纵符乃至机关函数。
virtual――申明办法或存取标记能够被承继类改写。
5.5.3存取润色符
存取润色符界说了某些代码对类成员(如办法和属性)的存取品级。你必需给每一个成员加上所但愿的存取润色符,不然,默许的存取范例是隐含的。
你能够使用4个存取润色符之一:
public――任何中央都能够会见该成员,这是具有起码限定的存取润色符。
protected――在类及一切的派生类中能够会见该成员,不同意内部会见。
private――仅仅在统一个类的外部才干会见该成员。乃至派生类都不克不及会见它。
internal――同意不异组件(使用程序或库)的一切代码会见。在.NET组件级别,你能够把它视为public,而在内部则为private。
为了演示存取润色符的用法,我略微修正了Triangle例子,使它包括了新增的域成员和一个新的派生类(见清单5.13)。
清单5.13在类中利用存取润色符
1:usingSystem;
2:
3:internalclassTriangle
4:{
5:protectedintm_a,m_b,m_c;
6:publicTriangle(inta,intb,intc)
7:{
8:m_a=a;
9:m_b=b;
10:m_c=c;
11:}
12:
13:publicvirtualdoubleArea()
14:{
15://Heronianformula
16:doubles=(m_a+m_b+m_c)/2.0;
17:doubledArea=Math.Sqrt(s*(s-m_a)*(s-m_b)*(s-m_c));
18:returndArea;
19:}
20:}
21:
22:internalclassPrism:Triangle
23:{
24:privateintm_h;
25:publicPrism(inta,intb,intc,inth):base(a,b,c)
26:{
27:m_h=h;
28:}
29:
30:publicoverridedoubleArea()
31:{
32:doubledArea=base.Area()*2.0;
33:dArea+=m_a*m_h+m_b*m_h+m_c*m_h;
34:returndArea;
35:}
36:}
37:
38:classPrismApp
39:{
40:publicstaticvoidMain()
41:{
42:Prismprism=newPrism(2,5,6,1);
43:Console.WriteLine(prism.Area());
44:}
45:}
Triangle类和Prism类如今被标为internal。这意味着它们只能在以后组件中被会见。请记着“.NET组件”这个术语指的是包装(packaging,),而不是你大概在COM+顶用到的组件。Triangle类有三个protected成员,它们在机关函数中被初始化,并用于面积盘算的办法中。因为这些成员是protected成员,以是我能够在派生类Prism中会见它们,在那边实行分歧的面积盘算。Prism本人新增了一个成员m_h,它是公有的――乃至派生类也不克不及会见它。
花些工夫为每一个类成员乃至每一个类企图一种回护条理,一般是个好主张。当必要引进修正时,周全的企图终极会匡助你,由于没有程序员会乐意利用“没有文档”的类功效。
5.6小结
这章显现了类的各类要素,它是运转实例(工具)的模板。在一个工具的性命期,起首被实行的代码是个机关函数。机关函数用来初始化变量,这些变量厥后在办法顶用于盘算了局。
办法同意你传送值、援用给变量,大概只传送一个输入值。办法能够被改写以完成新的功效,大概你能够屏障基类成员,假如它完成了一个具有和派生类成员不异名字的办法。
定名属性能够被看成域成员(成员变量)或属性存取标记完成。后者是get和set存取标记,疏忽一个或别的一个,你能够创立仅写或仅读属性。存取标记十分合适于确认赋给属性的值。
C#类的别的一个功效是索引,它使象数组语法一样会见类中值成为大概。另有,假如当类中的某些事变产生时,你想客户失掉关照,要让它们与事务联系关系。
当渣滓搜集器挪用析构函数时,工具的性命就停止了。因为你不克不及正确地展望这类情形甚么时分会产生,以是应当创立一个办法以开释这些可贵的资本,当你中断利用它们时。
你觉得数据库怎么样?
作者:
若天明
时间:
2015-1-20 05:20
在调试JSP代码时,如果程序出错,JSP服务器会返回出错信息,并在浏览器中显示。这时,由于JSP是先被转换成Servlet后再运行的,所以,浏览器中所显示的代码出错的行数并不是JSP源代码的行数。
作者:
冷月葬花魂
时间:
2015-1-25 22:59
我觉得什么语言,精通就好,你要做的就是比其他80%的人都厉害,你就能得到只有20%的人才能得到的高薪。
作者:
飘灵儿
时间:
2015-2-4 08:44
asp.net最主要特性包括:◆编程代码更简洁◆网站可实现的功能更强大◆运行效率高◆节省服务器的动作资源
作者:
老尸
时间:
2015-2-9 20:22
ASP.NET可以无缝地与WYSIWYGHTML编辑器和其他编程工具(包括MicrosoftVisualStudio.NET)一起工作。这不仅使得Web开发更加方便,而且还能提供这些工具必须提供的所有优点,包括开发人员可以用来将服务器控件拖放到Web页的GUI和完全集成的调试支持。微软为ASP.net设计了这样一些策略:易于写出结构清晰的代码、代码易于重用和共享、可用编译类语言编写等等,目的是让程序员更容易开发出Web应用,满足计算向Web转移的战略需要。
作者:
不帅
时间:
2015-2-27 21:01
大哥拜托,Java在95年就出来了,微软垄断个妹啊,服务器市场微软完全是后后来者,当年都是Unix的市场,现在被WindowsServer和Linux抢下大片,包括数据库也一样。
作者:
小魔女
时间:
2015-3-9 14:03
JSP/Servlet虽然在国内目前的应用并不广泛,但是其前途不可限量。
作者:
山那边是海
时间:
2015-3-16 22:49
主流网站开发语言之CGI:CGI就是公共网关接口(CommonGatewayInterface)的缩写。它是最早被用来建立动态网站的后台技术。这种技术可以使用各种语言来编写后台程序,例如C,C++,Java,Pascal等。
作者:
爱飞
时间:
2015-3-23 06:14
最强的技术支持WebService,而且有.NET的所有library做后盾。而且ASP.NET在.NET3.5中还有微软专门为AJAX开发的功能--ASP.NETAJAX。
欢迎光临 仓酷云 (http://ckuyun.com/)
Powered by Discuz! X3.2