仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 565|回复: 7
打印 上一主题 下一主题

[学习教程] ASP.NET编程:C#锋利体验之第八讲 索引器与操纵符重载...

[复制链接]
变相怪杰 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 22:34:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
其实Java之所以在曾经独步天下,就是因为他的跨平台、安全性,这两方面,效率可不是Java的强项,反而是他最短的一块挡板,虽然net总是用理论证明比.NET快。索引索引器
索引器(Indexer)是C#引进的一个新型的类成员,它使得工具能够像数组那样被便利,直不雅的援用。索引器十分相似于我们后面讲到的属性,但索引器能够有参数列表,且只能感化在实例工具上,而不克不及在类上间接感化。上面是典范的索引器的计划,我们在这里疏忽了详细的完成。
classMyClass{publicobjectthis[intindex]{get{//取数据}set{//存数据}}}
索引器没有像属性和办法那样的名字,关头字this分明地表达了索引器援用工具的特性。和属性一样,value关头字在set后的语句块里有参数传送意义。实践上从编译后的IL两头言语代码来看,下面这个索引器被完成为:
classMyClass{publicobjectget_Item(intindex){//取数据}publicvoidset_Item(intindex,objectvalue){//存数据}}
因为我们的索引器在面前被编译成get_Item(intindex)和set_Item(intindex,objectvalue)两个办法,我们乃至不克不及再在声明完成索引器的类内里声明完成这两个办法,编译器会对如许的举动报错。如许隐含完成的办法一样能够被我们举行挪用,承继等操纵,和我们本人完成的办法别无二致。知晓C#言语底层的编译完成为我们上面了解C#索引器的举动供应了一个很好的基本。
和办法一样,索引器有5种存取回护级别,和4种承继举动润色,和内部索引器。这些举动同办法没有任何不同,这里不再赘述。独一分歧的是索引器不克不及为静态(static),这在工具援用的语义下很简单了解。值得注重的是在掩盖(override)完成索引器时,应当用base[E]来存取父类的索引器。
和属性的完成一样,索引器的数据范例同时为get语句块的前往范例和set语句块中value关头字的范例。
索引器的参数列表也是值得注重的中央。“索引”的特性使得索引器必需具有最少一个参数,该参数位于this关头字以后的中括号内。索引器的参数也只能是传值范例,不成以有ref(援用)和out(输入)润色。参数的数据范例能够是C#中的任何数据范例。C#依据分歧的参数署名来举行索引器的多态辨析。中括号内的一切参数在get和set下都能够援用,而value关头字只能在set下作为传送参数。
上面是一个索引器的详细的使用例子,它对我们了解索引器的计划和使用很有匡助。
usingSystem;classBitArray{int[]bits;intlength;publicBitArray(intlength){if(length<0)thrownewArgumentException();bits=newint[((length-1)>>5)+1];this.length=length;}publicintLength{get{returnlength;}}publicboolthis[intindex]{get{if(index<0||index>=length)thrownewIndexOutOfRangeException();elsereturn(bits[index>>5]&1<<index)!=0;}set{if(index<0||index>=length)thrownewIndexOutOfRangeException();elseif(value)bits[index>>5]|=1<<index;elsebits[index>>5]&=~(1<<index);}}}classTest{staticvoidMain(){BitArrayBits=newBitArray(10);for(inti=0;i<10;i++)Bits=(i%2)==0;Console.Write(Bits+"");}}
编译并运转程序能够失掉上面的输入:
TrueFalseTrueFalseTrueFalseTrueFalseTrueFalse
下面的程序经由过程索引器的利用为用户供应了一个界面友爱的bool数组,同时又年夜年夜下降了程序的存储空间价值。索引器一般用于工具容器中为其内的工具供应友爱的存取界面--这也是为何C#将办法包装成索引器的缘故原由地点。实践上,我们能够看到索引器在.NETFramework类库中有大批的使用。
操纵符重载
操纵符是C#顶用于界说类的实例工具间表达式操纵的一种成员。和索引器相似,操纵符仍旧是对办法完成的一种逻辑界面笼统,也就是说在编译成的IL两头言语代码中,操纵符仍旧是以办法的情势挪用的。在类内界说操纵符成员又叫操纵符重载。C#中的重载操纵符共有三种:一元操纵符,二元操纵符和转换操纵符。并非一切的操纵符都能够重载,三种操纵符都有响应的可重载操纵符集,列于下表:
一元操纵符+-!~++--truefalse
二元操纵符+-*/%&|^<>==!=>=<=
转换操纵符隐式转换()和显式转换()
重载操纵符必需是public和static润色的,不然会引发编译毛病,这在操纵符的逻辑语义下是不问可知的。父类的重载操纵符会被子类承继,但这类承继没有掩盖,埋没,笼统等举动,不克不及对重载操纵符举行virtualsealedoverrideabstract润色。操纵符的参数必需为传值参数。我们上面来看一个详细的例子:
usingSystem;classComplex{doubler,v;//r+vipublicComplex(doubler,doublev){this.r=r;this.v=v;}publicstaticComplexoperator+(Complexa,Complexb){returnnewComplex(a.r+b.r,a.v+b.v);}publicstaticComplexoperator-(Complexa){returnnewComplex(-a.r,-a.v);}publicstaticComplexoperator++(Complexa){doubler=a.r+1;doublev=a.v+1;returnnewComplex(r,v);}publicvoidPrint(){Console.Write(r+"+"+v+"i");}}classTest{publicstaticvoidMain(){Complexa=newComplex(3,4);Complexb=newComplex(5,6);Complexc=-a;c.Print();Complexd=a+b;d.Print();a.Print();Complexe=a++;a.Print();e.Print();Complexf=++a;a.Print();f.Print();}}
编译程序并运转可失掉上面的输入:
-3+-4i8+10i3+4i4+5i3+4i5+6i5+6i
我们这里完成了一个“+”号二元操纵符,一个“-”号一元操纵符(取负值),和一个“++”一元操纵符。注重这里,我们都没有对传出去的参数作任何改动--这在参数是援用范例的变量是特别主要,固然重载操纵符的参数只能是传值体例。而我们在前往值时,常常必要“new”一个新的变量--除true和false操纵符。这在重载“++”和“--”操纵符时特别显得主要。也就是说我们做在a++时,我们将抛弃本来的a值,而代替的是新的new出来的值给a!值得注重的是e=a++或f=++a中e的值或f的值基本与我们重载的操纵符前往值没有一点接洽!它们的值仅仅是在前置和后置的情形下取得a的旧值或新值罢了!前置和后置的举动不难了解。
操纵符重载对前往值和参数范例有着相称严厉的请求。一元操纵符中只要一个参数。操纵符“++”和“--”前往值范例和参数范例必需和声明该操纵符的范例一样。操纵符“+-!~”的参数范例必需和声明该操纵符的范例一样,前往值范例能够恣意。true和false操纵符的参数范例必需和声明该操纵符的范例一样,而前往值范例必需为bool,并且必需配对呈现--也就是说只声明个中一个是不合错误的,会引发编译毛病。参数范例的分歧会招致同名的操纵符的重载--实践上这是办法重载的体现。
二元操纵符参数必需为两个,并且两个必需最少有一个的参数范例为声明该操纵符的范例。前往值范例能够恣意。有三对操纵符也必要必需配对声明呈现,它们是“==”和“!=”,“>”和“<”,“>=”和“<=”。必要注重的是两个参数的范例分歧,固然范例不异但按次分歧城市招致同名的操纵符的重载。
转换操纵符为分歧范例之间供应隐式转换和显式转换,次要用于办法挪用,转型表达和赋值操纵。转换操纵符对其参数范例(被转换范例)和前往值范例(转换范例)也有严厉的请求。参数范例和前往值范例不克不及不异,且二者之间必需最少有一个和界说操纵符的范例不异。转换操纵符必需界说在被转换范例或转换范例任何个中一个内里。不克不及对体系界说过的转换操纵举行从头界说。两个范例也都不克不及是object或接口范例,二者之间不克不及有间接或直接的承继干系--这三种情形体系已默许转换。我们来看一个例子:
usingSystem;publicstructDigit{bytevalue;publicDigit(bytevalue){if(value<0||value>9)thrownewArgumentException();this.value=value;}publicstaticimplicitoperatorbyte(Digitd){returnd.value;}publicstaticexplicitoperatorDigit(byteb){returnnewDigit(b);}}
下面的例子供应了Digit范例和byte范例之间的隐式转换和显式转换。从Digit到byte的转换为隐式转换,转换历程不会由于丧失任何信息而抛出非常。从byte到Digit的转换为显式转换,转换历程有大概因丧失信息而抛出非常。实践上这也为我们展现了甚么时分声明隐式转换,甚么时分声分明示转换的计划准绳。不克不及对统一参数范例同时声明隐式转换和显式转换。隐式转换和显式转换无需配对利用--固然C#保举如许做。
实践上能够看到,关于属性,索引器和操纵符这些C#供应给我们的界面操纵,都是办法的某种情势的逻辑笼统包装,它旨在为我们界说的范例的用户供应一个友爱易用的界面--我们完整能够经由过程办法来完成它们完成的功效。了解了如许的计划初志,我们才会得当,准确地用好这些操纵,而不致招致滥用和错用。
因为二次编译器太复杂,那么建议只是在安装程序的时候编译一次,而不类似java那样运行就编译。并且我觉得,一次痛苦,总比多次低效率要舒服多了。
不帅 该用户已被删除
沙发
发表于 2015-1-18 22:57:32 | 只看该作者
ASP(ActiveServerPages)是Microsfot公司1996年11月推出的WEB应用程序开发技术,它既不是一种程序语言,也不是一种开发工具,而是一种技术框架,不须使用微软的产品就能编写它的代码。
愤怒的大鸟 该用户已被删除
板凳
发表于 2015-1-23 22:40:46 | 只看该作者
它可通过内置的组件实现更强大的功能,如使用A-DO可以轻松地访问数据库。
飘灵儿 该用户已被删除
地板
发表于 2015-1-31 20:20:08 | 只看该作者
使用普通的文本编辑器编写,如记事本就可以完成。由脚本在服务器上而不是客户端运行,ASP所使用的脚本语言都在服务端上运行,用户端的浏览器不需要提供任何别的支持,这样大提高了用户与服务器之间的交互的速度。
深爱那片海 该用户已被删除
5#
发表于 2015-2-6 22:35:12 | 只看该作者
使用普通的文本编辑器编写,如记事本就可以完成。由脚本在服务器上而不是客户端运行,ASP所使用的脚本语言都在服务端上运行,用户端的浏览器不需要提供任何别的支持,这样大提高了用户与服务器之间的交互的速度。
爱飞 该用户已被删除
6#
发表于 2015-3-6 11:46:33 | 只看该作者
主流网站开发语言之CGI:CGI就是公共网关接口(CommonGatewayInterface)的缩写。它是最早被用来建立动态网站的后台技术。这种技术可以使用各种语言来编写后台程序,例如C,C++,Java,Pascal等。
柔情似水 该用户已被删除
7#
发表于 2015-3-13 00:17:15 | 只看该作者
主流网站开发语言之ASP:ASP是微软(Microsoft)所开发的一种后台脚本语言,它的语法和VisualBASIC类似,可以像SSI(ServerSideInclude)那样把后台脚本代码内嵌到HTML页面中。虽然ASP简单易用,但是它自身存在着许多缺陷,最重要的就是安全性问题。
蒙在股里 该用户已被删除
8#
发表于 2015-3-20 07:29:49 | 只看该作者
弱类型造成潜在的出错可能:尽管弱数据类型的编程语言使用起来回方便一些,但相对于它所造成的出错几率是远远得不偿失的。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-9-29 14:24

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表