飘飘悠悠 发表于 2015-1-16 22:26:38

ASP编程:> 第五章 类(rainbow 翻译)*1 (来...

缺点:正版成本价格贵(盗版就不说了)、不够安全,大多数服务器用windows系统,没有linux安全<<展示C#>>第五章类(rainbow翻译)
出处:http://www.informit.commatterser0000002
注释:
第五章类
前一章会商了数据范例和它们的用法。如今我们转移到C#中相当主要的布局――类。没有了类,就连复杂的C#程序都不克不及编译。这一章假定你晓得了一个类的基础构成部分:办法、属性、机关函数和析构函数。C#在个中增添了索引和事务。
在这一章中,你学到以下有关类的话题。
。利用机关函数和析构函数
。给类写办法
。给一个类增添属性存取标记
。完成索引
。创立事务并经由过程代表元为事务联系关系客户
。使用类、成员和存取润色符。

5.1机关函数和析构函数
在你能够会见一个类的办法、属性或任何别的器材之前,第一条实行的语句是包括有响应类的机关函数。乃至你本人不写一个机关函数,也会有一个缺省的机关函数供应给你。

classTestClass
{
publicTestClass():base(){}//由编译器供应
}

一个机关函数老是和它的类名不异,可是,它没有声明前往范例。总之,机关函数老是public的,你能够用它们来初始化变量。

publicTestClass()
{
//在这给变量
//初始化代码等等。
}

假如类仅包括静态成员(能以范例挪用,而不是以实例挪用的成员),你能够创立一个private的机关函数。
privateTestClass(){}
只管存取润色符在这一章的前面将要年夜篇幅地会商,可是private意味着从类的表面不成能会见该机关函数。以是,它不克不及被挪用,且没有工具能够自该类界说被实例化。
其实不仅限于无参数机关函数――你能够传送初始参数来初始化成员。
publicTestClass(stringstrName,intnAge){...}

作为一个C/C++程序员,你大概习气于给初始化写一个附加的办法,由于在机关函数中没有前往值。固然,只管在C#中也没有前往值,但你能够激发一个便宜的非常,以从机关函数取得前往值。更多有关非常处置的常识在第七章"非常处置"中有会商。
可是,当你保存援用给可贵的资本,应当想到写一个办法来办理:一个能够被显式地挪用来开释这些资本。成绩是当你能够在析构函数(以类名的后面加"~"的体例定名)中做一样的事变时,为什么还要写一个附加的办法.
public~TestClass()
{
//扫除
}

你应当写一个附加办法的缘故原由是渣滓搜集器,它在变量超越局限后其实不会当即被挪用,而仅当间歇时代或内存前提满意时才被触发。当你锁住资本的工夫善于你所企图的工夫时,它就会产生。因而,供应一个显式的开释体例是一个好主张,它一样能从析构函数中挪用。

publicvoidRelease()
{
//开释一切可贵的资本
}

public~TestClass()
{
Release();
}

挪用析构函数中的开释办法并非需要的――总之,渣滓搜集会寄望开释工具。但没有健忘扫除是一种优秀的习气。

5.2办法
既然工具能准确地初始化和停止,所剩上去的就是往类中增添功效。在年夜多半情形下,功效的次要部分在办法中能失掉完成。你早已见过静态办法的利用,可是,这些是范例(类)的部分,不是实例(工具)。
为了让你敏捷进门,我把这些办法的啰嗦成绩布置为三节:
。办法参数
。改写办法
。办法屏障
5.2.1办法参数
因办法要处置变动数值,你多几少要传送值给办法,并从办法取得前往值。以下三个部分触及到由传送值和为挪用者猎取前往了局所引发的成绩。

。输出参数
。援用参数
。输入参数

5.2.1.1输出参数
你早已在例子中见过的一个参数就是输出参数。你用一个输出参数经由过程值传送一个变量给一个办法――办法的变量被挪用者传送出去的值的一个拷贝初始化。清单5.1树模输出参数的利用。

清单5.1经由过程值传送参数

1:usingSystem;
2:
3:publicclassSquareSample
4:{
5:publicintCalcSquare(intnSideLength)
6:{
7:returnnSideLength*nSideLength;
8:}
9:}
10:
11:classSquareApp
12:{
13:publicstaticvoidMain()
14:{
15:SquareSamplesq=newSquareSample();
16:Console.WriteLine(sq.CalcSquare(25).ToString());
17:}
18:}

由于我传送值而不是援用给一个变量,以是当挪用办法时(见第16行),可使用一个常量表达式(25)。整型了局被传回给挪用者作为前往值,它没有存到两头变量就被当即显现到屏幕上。
输出参数按C/C++程序员早已习气的事情体例事情。假如你来自VB,请注重没有能被编译器处置的隐式ByVal或ByRef――假如没有设定,参数老是用值传送。
这点仿佛与我后面所报告的有抵触:关于一些变量范例,用值传送实践上意味着用援用传送。利诱吗?一点背景常识也不必要:COM中的器材就是接口,每个类能够具有一个或多个接口。一个接口只不外是一组函数指针,它不包括数据。反复该数组会华侈良多内存资本;以是,仅入手下手地点被拷贝给办法,它作为挪用者,仍旧指向接口的不异指针。那就是为何工具用值传送一个援用。

5.2.1.2援用参数
只管能够使用输出参数和前往值创建良多办法,但你一想到要传送值并原地修正它(也就是在不异的内存地位),就没有那末好运了。这里用援用参数就很便利。
voidmyMethod(refintnInOut)
由于你传送了一个变量给该办法(不单单是它的值),变量必需被初始化。不然,编译器会报警。清单5.2显现怎样用一个援用参数创建一个办法。

清单5.2经由过程援用传送参数

1://classSquareSample
2:usingSystem;
3:
4:publicclassSquareSample
5:{
6:publicvoidCalcSquare(refintnOne4All)
7:{
8:nOne4All*=nOne4All;
9:}
10:}
11:
12:classSquareApp
13:{
14:publicstaticvoidMain()
15:{
16:SquareSamplesq=newSquareSample();
17:
18:intnSquaredRef=20;//必定要初始化
19:sq.CalcSquare(refnSquaredRef);
20:Console.WriteLine(nSquaredRef.ToString());
21:}
22:}

正如所看到的,一切你要做的就是给界说和挪用都加上ref限制符。由于变量经由过程援用传送,你能够用它来盘算出了局并传回该了局。可是,在实际的使用程序中,我激烈倡议要用两个变量,一个输出参数和一个援用参数。

5.2.1.3输入参数
传送参数的第三种选择就是把它设作一个输入参数。正如该名字所表示,一个输入参数仅用于从办法传送回一个了局。它和援用参数的另外一个区分在于:挪用者不用先初始化变量才挪用办法。这显现在清单5.3中。

清单5.3界说一个输入参数

1:usingSystem;
2:
3:publicclassSquareSample
4:{
5:publicvoidCalcSquare(intnSideLength,outintnSquared)
6:{
7:nSquared=nSideLength*nSideLength;
8:}
9:}
10:
11:classSquareApp
12:{
13:publicstaticvoidMain()
14:{
15:SquareSamplesq=newSquareSample();
16:
17:intnSquared;//不用初始化
18:sq.CalcSquare(15,outnSquared);
19:Console.WriteLine(nSquared.ToString());
20:}
21:}


5.2.2改写办法
面向工具计划的主要准绳就是多态性。不要剖析深邃的实际,多态性意味着:当基类程序员已计划好用于改写的办法时,在派生类中,你就能够重界说(改写)基类的办法。基类程序员能够用virtual关头字计划办法:
virtualvoidCanBOverridden()
当从基类派生时,一切你要做的就是在新办法中到场override关头字:
overridevoidCanBOverridden()
当改写一个基类的办法时,你必需分明,不克不及改动办法的会见属性――在这章的前面,你会学到更多关于会见润色符的常识。
除改写基类办法的现实外,另有另外一个乃至更主要的改写特征。当把派生类强迫转换成基类范例并接着挪用假造办法时,被挪用的是派生类的办法而不是基类的办法。
((BaseClass)DerivedClassInstance).CanBOverridden();
为了演示假造办法的观点,清单5.4显现怎样创立一个三角形基类,它具有一个能够被改写的成员办法(ComputeArea)。

清单5.4改写一个基类的办法

1:usingSystem;
2:
3:classTriangle
4:{
5:publicvirtualdoubleComputeArea(inta,intb,intc)
6:{
7://Heronianformula
8:doubles=(a+b+c)/2.0;
9:doubledArea=Math.Sqrt(s*(s-a)*(s-b)*(s-c));
10:returndArea;
11:}
12:}
13:
14:classRightAngledTriangle:Triangle
15:{
16:publicoverridedoubleComputeArea(inta,intb,intc)
17:{
18:doubledArea=a*b/2.0;
19:returndArea;
20:}
21:}
22:
23:classTriangleTestApp
24:{
25:publicstaticvoidMain()
26:{
27:Triangletri=newTriangle();
28:Console.WriteLine(tri.ComputeArea(2,5,6));
29:
30:RightAngledTrianglerat=newRightAngledTriangle();
31:Console.WriteLine(rat.ComputeArea(3,4,5));
32:}
33:}

基类Triangle界说了办法ComputeArea。它接纳三个参数,前往一个double了局,且具有大众会见性。从Triangle类派生出的是RightAngledTriangle,它改写了ComputeArea办法,并完成了本人的面积盘算公式。两个类都被实例化,且在定名为TriangleTestApp的使用类的Main()办法中失掉考证。
我漏懂得释第14行:
classRightAngledTriangle:Triangle
在类语句中冒号(:)暗示RightAngledTriangle从类Triangle派生。那就是你所必需要做的,以让C#晓得你想把Triangle看成RightAngledTriangle的基类。
当细心察看直角三角形的ComputeArea办法时,你会发明第3个参数并没有效于盘算。可是,使用该参数就能够考证是不是是“直角”。如清单5.5所示。

清单5.5挪用基类完成

1:classRightAngledTriangle:Triangle
2:{
3:publicoverridedoubleComputeArea(inta,intb,intc)
4:{
5:constdoubledEpsilon=0.0001;
6:doubledArea=0;
7:if(Math.Abs((a*a+b*b-c*c))>dEpsilon)
8:{
9:dArea=base.ComputeArea(a,b,c);
10:}
11:else
12:{
13:dArea=a*b/2.0;
14:}
15:
16:returndArea;
17:}
18:}

该检测复杂天时用了毕达哥拉斯公式,关于直角三角形,检测了局必需为0。假如了局不为0,类就挪用它基类的ComputeArea来完成。
dArea=base.ComputeArea(a,b,c);
例子的要点为:经由过程显式天时用基类的资历反省,你就可以十拿九稳地挪用基类完成改写办法。
当你必要完成其在基类中的功效,而不肯意在改写办法中反复它时,这就十分有匡助。

5.2.3办法屏障
重界说办法的一个分歧手腕就是要屏障基类的办法。当从他人供应的类派生类时,这个功效出格有代价。看清单5.6,假定BaseClass由其别人所写,而你从它派生出DerivedClass。

清单5.6DerivedClass完成一个没有包括于BaseClass中的办法

1:usingSystem;
2:
3:classBaseClass
4:{
5:}
6:
7:classDerivedClass:BaseClass
8:{
9:publicvoidTestMethod()
10:{
11:Console.WriteLine("DerivedClass::TestMethod");
12:}
13:}
14:
15:classTestApp
16:{
17:publicstaticvoidMain()
18:{
19:DerivedClasstest=newDerivedClass();
20:test.TestMethod();
21:}
22:}

在这个例子中,DerivedClass经由过程TestMethod()完成了一个分外的功效。可是,假如基类的开辟者以为把TestMethod()放在基类中是个好主张,并利用不异的名字完成它时,会呈现甚么成绩呢?(见清单5.7)

清单5.7BaseClass完成和DerivedClass不异的办法

1:classBaseClass
2:{
3:publicvoidTestMethod()
4:{
5:Console.WriteLine("BaseClass::TestMethod");
6:}
7:}
8:
9:classDerivedClass:BaseClass
10:{
11:publicvoidTestMethod()
12:{
13:Console.WriteLine("DerivedClass::TestMethod");
14:}
15:}

在优异的编程言语中,你如今会碰到一个真实的年夜贫苦。可是,C#会给你提出告诫:
hiding2.cs(13,14):warningCS0114:DerivedClass.TestMethod()hidesinheritedmemberBaseClass.TestMethod().Tomakethecurrentmethodoverridethatimplementation,addtheoverridekeyword.Otherwiseaddthenewkeyword.
(hiding2.cs(13,14):告诫CS0114:DerivedClass.TestMethod()屏障了所承继的成员BaseClass.TestMethod()。要想使以后办法改写本来的完成,加上override关头字。不然加上新的关头字。)
具有了润色符new,你就能够告知编译器,不用重写派生类或改动利用到派生类的代码,你的办法就可以屏障新到场的基类办法。清单5.8显现怎样在例子中使用new润色符。

清单5.8屏障基类办法

1:classBaseClass
2:{
3:publicvoidTestMethod()
4:{
5:Console.WriteLine("BaseClass::TestMethod");
6:}
7:}
8:
9:classDerivedClass:BaseClass
10:{
11:newpublicvoidTestMethod()
12:{
13:Console.WriteLine("DerivedClass::TestMethod");
14:}
15:}

利用了附加的new润色符,编译器就晓得你重界说了基类的办法,它应当屏障基类办法。可是,假如你按以下体例编写:
DerivedClasstest=newDerivedClass();
((BaseClass)test).TestMethod();
基类办法的完成就被挪用了。这类举动分歧于改写办法,后者包管年夜部分拨生办法
http://www.ckuyun.com/

缺点:安全性不是太差了,还行,只要你充分利用系统自带的工具;唯一缺点就是执行效率慢,如何进行网站优化以后,效果会比较好。

再现理想 发表于 2015-1-19 12:28:57

学习ASP其实应该上升到如何学习程序设计这种境界,其实学习程序设计又是接受一种编程思想。比如ASP如何学习,你也许在以前的学习中碰到过。以下我仔细给你说几点:

海妖 发表于 2015-1-25 10:37:51

交流是必要的,不管是生活还是学习我们都要试着去交流,通过交流我们可以学到很多我们自己本身所没有的知识,可以分享别人的经验甚至经历。

爱飞 发表于 2015-2-2 21:43:08

从事这个行业,那么你可以学ASP语言,简单快速上手,熟练dreamweav排版,写asp代码,熟练photoshop处理图片,打好基础就行了

若天明 发表于 2015-2-8 07:27:59

交流是必要的,不管是生活还是学习我们都要试着去交流,通过交流我们可以学到很多我们自己本身所没有的知识,可以分享别人的经验甚至经历。

飘灵儿 发表于 2015-2-24 23:39:38

在平时的学习过程中要注意现学现用,注重运用,在掌握了一定的基础知识后,我们可以尝试做一些网页,也许在开始的时候我们可能会遇到很多问题,比如说如何很好的构建基本框架。

乐观 发表于 2015-3-7 14:21:32

如何学好ASP,以前也有人问过,把回答给你转过来看看能否对你有帮助:

柔情似水 发表于 2015-3-15 07:38:08

你可以通过继承已有的对象最大限度保护你以前的投资。并且C#和C++、Java一样提供了完善的调试/纠错体系。

简单生活 发表于 2015-3-21 22:24:27

Application:这个存储服务端的数据,如果不清除,会直到web应用程序结束才清除(例如重启站点)
页: [1]
查看完整版本: ASP编程:> 第五章 类(rainbow 翻译)*1 (来...