下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、(一)索引器教程定义索引器”使您可以创建作为康拟数组”的类。该类的实例可以使用口数组访问运算符进行访问。在C#中定义索引器类似于在C+中定义运算符口,但前者灵活得多。对于封装类似数组的功能或类似集合的功能的类,使用索引器使该类的用户可以使用数组语法访问该类。例如,假定您想定义一个类,该类使文件显示为字节数组。如果文件非常大,则将整个文件读入内存是不切实际的,尤其在您只想读取或更改少数字节时。通过定义FileByteArray类,您可使文件外观类似于字节数组,但读或写字节时,实际执行的是文件的输入和输出。除下面的示例以外,本教程中还讨论有关创建索引属性”的高级主题。示例本示例中,FileByte
2、Array类使得像字节数组那样访问文件成为可能。Reverse类反转文件的字节。可以运行该程序以反转任何文本文件的字节,包括程序源文件本身。若要将反转的文件更改回正常状态,请在同一文件上再次运行该程序。/indexer.cs/arguments:indexer.txtusingSystem;usingSystem.IO;/Classtoprovideaccesstoalargefile/asifitwereabytearray.publicclassFileByteArrayStreamstream;/Holdstheunderlyingstream/usedtoaccessthefile./
3、CreateanewFileByteArrayencapsulatingaparticularfile.publicFileByteArray(stringfileName)stream=newFileStream(fileName,FileMode.Open);/Closethestream.Thisshouldbethelastthingdone/whenyouarefinished.publicvoidClose()stream.Close();stream=null;/Indexertoprovideread/writeaccesstothefile.publicbytethislon
4、gindex/longisa64-bitinteger/Readonebyteatoffsetindexandreturnit.getbytebuffer=newbyte1;stream.Seek(index,SeekOrigin.Begin);stream.Read(buffer,0,1);returnbuffer0;/Writeonebyteatoffsetindexandreturnit.setbytebuffer=newbyte1value;stream.Seek(index,SeekOrigin.Begin);stream.Write(buffer,0,1);/Getthetotal
5、lengthofthefile.publiclongLengthgetreturnstream.Seek(0,SeekOrigin.End);/DemonstratetheFileByteArrayclass./Reversesthebytesinafile.publicclassReversepublicstaticvoidMain(Stringargs)/Checkforarguments.if(args.Length=0)Console.WriteLine("indexer<filename>");return;FileByteArrayfile=newF
6、ileByteArray(args0);longlen=file.Length;/Swapbytesinthefiletoreverseit.for(longi=0;i<len/2;+i)bytet;/Notethatindexingthe"file"variableinvokesthe/indexerontheFileByteStreamclass,whichreads/andwritesthebytesinthefile.t=filei;filei=filelen-i-1;filelen-i-1=t;file.Close();输入:indexer.txt索引器”示
7、例中称为Test.txt)若要测试程序,可使用具有以下内容的文本文件(该文件在publicclassHellol(publicstaticvoidMain()(System.Console.WriteLine("Hello,World!");若要反转该文件的字节,请编译程序,然后使用下面的命令行:indexerindexer.txt若要显示反转的文件,请输入命令:Typeindexer.txt示例输出;)"!dlroW,olleH"(eniLetirW.elosnoC.metsyS()(niaMdiovcitatscilbup(1olleHssalcci
8、lbup代码讨论* 由于索引器是使用口运算符进行访问的,因此没有名称。有关索引器声明语法,请参见索引器。* 在上面的示例中,索引器类型是byte,并采用long(64位整数)类型的单个索引。获取"(Get)访问器定义从文件读取一个字节的代码,而设置”(Set)访问器定义向文件写入一个字节的代码。在设置”(Set)访问器内,预定义的参数值为正赋给虚拟数组元素的值。* 索引器必须至少有一个参数。尽管相当少见,但索引器可以有多个参数,以模拟多维虚拟数组”。尽管整数参数最常见,但索引器参数可以为任何类型。例如,标准的字典"(Dictionary)类提供参数类型为Object的索引器
9、。* 尽管索引器功能强大,但有一点很重要,仅当类似数组的抽象化有意义时才使用索引器。始终应仔细考虑使用常规方法是否会同样清楚。例如,下面是使用索引器不当的例子:classEmployee(/VERYBADSTYLE:usinganindexertoaccess/thesalaryofanemployee.publicdoublethisintyear(get(/returnemployee'ssalaryforagivenyear.)尽管合法,但只有获取"(Get)访问器的索引器通常不是很好的结构。在此情况下,强烈建议考虑使用方法。(二)索引属性本教程展示如何实现使用索引属性
10、的类。索引属性使您可以使用表示类似于数组的若干种不同事物的集合的类。学习本教程以前应完成索引器教程。教程假定您要编写一个Document类,该类封装非常长的文本章节。为能够方便地实现各种操作(如检查拼写),您可能希望以单词(以及字符)的虚拟数组形式查看文档。下面的示例展示实现这种类的技术。对于每个索引属性",您定义一个嵌套类,该类包含对主类实例的反向引用。主类上的readonly字段提供对嵌套类(定义每个虚拟数组)的实例的访问。每个嵌套类定义一个索引器以及其他类似集合的方法(例如Count属性)。下面的示例针对Words”和Characters”展示这一点。注意:请慎重使用该技术!仅
11、在使用数组索引操作提供的抽象化能明确阐明使用您的类的代码,并且索引器同时具有获取"(Get)和设置"(Set)访问器时,才使用该模式。示例本示例中定义了Document类。使用Words和Characters这两个索引属性在Document对象上执行某些文本操作。/indexedproperty.csusingSystem;publicclassDocument/Typeallowingthedocumenttobeviewedlikeanarrayofwords:publicclassWordCollectionreadonlyDocumentdocument;/Thec
12、ontainingdocumentinternalWordCollection(Documentd)document=d;)/Helperfunction-searchcharacterarray"text",startingat/character"begin",forwordnumber"wordCount."Returnsfalse/iftherearelessthanwordCountwords.Sets"start"and/length"tothepositionandlengthofthewo
13、rdwithintext:privateboolGetWord(chartext,intbegin,intwordCount,outintstart,outintlength)intend=text.Length;intcount=0;intinWord=-1;start=length=0;for(inti=begin;i<=end;+i)boolisLetter=i<end&&Char.IsLetterOrDigit(texti);if(inWord>=0)if(!isLetter)if(count+=wordCount)start=inWord;lengt
14、h=i-inWord;returntrue;inWord=-1;elseif(isLetter)inWord=i;returnfalse;/Indexertogetandsetwordsofthecontainingdocument:publicstringthisintindexgetintstart,length;if(GetWord(document.TextArray,0,index,outstart,outlength)returnnewstring(document.TextArray,start,length);elsethrownewIndexOutOfRangeExcepti
15、on();setintstart,length;if(GetWord(document.TextArray,0,index,outstart,outlength)/Replacethewordatstart/lengthwiththe/string"value":if(length=value.Length)Array.Copy(value.ToCharArray(),0,document.TextArray,start,length);)else(char口newText=newchardocument.TextArray.Length+value.Length-leng
16、th;Array.Copy(document.TextArray,0,newText,0,start);Array.Copy(value.ToCharArray(),0,newText,start,value.Length);Array.Copy(document.TextArray,start+lengthnewText,start+value.Length,document.TextArray.Length-start-length);document.TextArray=newText;)elsethrownewIndexOutOfRangeException();)/Getthecou
17、ntofwordsinthecontainingdocument:publicintCount(get(0,intcount=0,start=0,length=0;while(GetWord(document.TextArray,start+length,outstart,outlength)+count;returncount;)/Typeallowingthedocumenttobeviewedlikean"array"/ofcharacters:publicclassCharacterCollection(readonlyDocumentdocument;/Theco
18、ntainingdocumentinternalCharacterCollection(Documentd)(document=d;)/Indexertogetandsetcharactersinthecontainingdocument:publiccharthisintindex(get(returndocument.TextArrayindex;set(document.TextArrayindex=value)/Getthecountofcharactersinthecontainingdocument:publicintCount(get(returndocument.TextArray.Length;)/Becausethetypesofthefieldshaveindexers,/thesefieldsappearas"indexedpr
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年度互联网游戏开发与发行合同
- 2024年度物联网技术研发与应用借款合同
- 纸制名牌市场环境与对策分析
- 04年版车位代理销售合同范本
- 酒囊项目评价分析报告
- 运送滑雪者上坡的装置市场需求与消费特点分析
- 运动制服市场需求与消费特点分析
- 空气分析仪器市场需求与消费特点分析
- 2024年度专利实施许可合同标的知识产权条款
- 2024年度品牌授权合同(特许经营)
- 2024中智集团总部及下属单位多岗位面向社会公开招聘7人【重点基础提升】模拟试题(共500题)附带答案详解
- 八年级足球“局部对抗情境下攻防技战术运用”主题大单元教学设计
- DB36- 1149-2019 工业废水铊污染物排放标准
- 国有企业员工违纪违规行为处分规定-职工违纪违规处分规定
- 开心六年级上册 Unit 4 Keeping Clean 单元测试 含听力书面材料及答案 1
- 园艺与健康智慧树知到期末考试答案2024年
- 第10课时-小人物-大情怀-单元总结-七年级语文下册(部编版)
- 电子烟市场调研报告总结与反思
- 厂务动力系统培训课件
- 日本国家概况历年试题及答案
- 数值分析智慧树知到期末考试答案2024年
评论
0/150
提交评论