第五讲代表事件和索引指示器5.1使用索引器索引器能够将索引用于对象来获得该对象所存储的值。定义格式:Public数据类型this[intindex]{Get{想返回的值}Set{想赋予的值}}修饰符有:newpublicprotectedinternalprivatevirtualsealedoverrideabstract例如下面的例子用于打印出小组人员的名单程序清单usingSystemclassTeam{strings_name=newstring[8];publicstringthis[intnIndex]{Get{returns_name[nIndex];}Set{s_name[nIndex]=value;}}}classTest{publicstaticvoidMain(){Teamt1=newTeam();for(inti=0;i8;i++)Console.WriteLine(t1[i]);}}根据域名解析IP地址程序清单usingSystem;usingSystem.Net;classResolveDNS{IPAddress[]m_arrayIPs;PublicvoidResolve(strings_host){IPHostEntryip=DNS.GetHostByName(s_host);m_arrayIPs=ip.AddressList;}publicIPAddressthis[intnIndex]{Get{returnm_arrayIPs[nIndex];}}publicintIPLength{Get{returnm_arrayIPs.Length;}}}classTestApp{publicstaticvoidMain(){ResolveDNSresolver1=newResolveDNS();resolver1.Resolve();intn=resolver1.IPLength;Console.WriteLine(“GettheIPAddressofthehost”);Console.WriteLine();for(inti=0;in;i++)Console.WriteLine(resolver1[i]);}}而索引指示器则可以像数组那样对对象进行索引访问。5.2代表代表是一种引用类型,它定义了方法调用的特征标。这样代表便可以接受并执行具有这种特征标格式的方法。代表声明的格式:Publicdelegate返回类型代表名(参数列表);例:1、Publicdelegatevoidsort(refinta,refintb);看似方法定义,但没有方法体。代表只是可以被执行的方法的模版。方法被委托给代表来执行。代表是多个方法的模版,sort代表可以使用的方法。1)、publicstaticvoidAscending(refintfirst,refintsecond){If(firstsecond){Inttemp=first;First=second;Second=temp;}}2)、publicstaticvoidDescending(refintfirst,refintsecond){If(firstsecond){Inttemp=first;First=second;Second=temp;}}2、接下来将代表与方法关联起来,为此需要实例化代表对象。Sortup=newsort(Ascending);//请注意参数是方法名。把方法名委托给代表。Sortdown=newsort(Descending);3、将委托的方法执行(创建一个接受一个代表对象的方法。该方法便可以执行被委托的方法)PublicvoidDosort(sortar){Ar(refval1,refval2);}4、看一个完整的例子usingSystem;publicclassSortClass{staticpublicintval1;staticpublicintval2;publicdelegatevoidSort(refinta,refintb);//定义代表publicvoidDoSort(Sortar)//执行委托方法{ar(refval1,refval2);}}publicclassSortProgram{publicstaticvoidAscending(refintfirst,refintsecond){if(firstsecond){inttmp=first;first=second;second=tmp;}}publicstaticvoidDescending(refintfirst,refintsecond){if(firstsecond){inttmp=first;first=second;second=tmp;}}publicstaticvoidMain(){SortClass.Sortup=newSortClass.Sort(Ascending);//创建代表对象SortClass.Sortdown=newSortClass.Sort(Descending);SortClassdoIT=newSortClass();//创建sortclass对象SortClass.val1=310;//设置排序变量SortClass.val2=220;Console.WriteLine(BeforeSort:val1={0},val2={1},SortClass.val1,SortClass.val2);doIT.DoSort(up);//调用dosort方法Console.WriteLine(AfterSort:val1={0},val2={1},SortClass.val1,SortClass.val2);Console.WriteLine(BeforeSort:val1={0},val2={1},SortClass.val1,SortClass.val2);doIT.DoSort(down);Console.WriteLine(AfterSort:val1={0},val2={1},SortClass.val1,SortClass.val2);}}5.3事件形象地说,事件event就是类或对象用来“发出通知”的成员,通过提供事件的句柄,客户能够把事件和可执行代码联系在一起。事件是类发出的通知,指出了发生某种事情。这样其他类可以根据通知执行某种操作。5.3.1创建事件创建并使用事件的步骤:为事件建立代表创建一个类来给事件处理程序传递参数、声明事件对应的代码创建事件发生时将执行的代码。1、事件的代表要使用事件,首先为事件创建一个代表。创建格式为:DelegatevoidEventHandlerName(objectsource,xxxEventArgse);EventHandlerName事件代表名称。事件的代表总是两个参数,第一个是引发事件的源,第二个参数是一个可包含事件处理程序可以使用的数据。例:DelegatevoidCharEventHandler(objectsource,CharEventArgse);2、EventArgs类EventArgs类用于将数据传递给事件处理程序,它可以派生出一些新类,即包含用于存储所需值的数据成员。派生类格式:PublicclassxxxEventArgs:EventArgs{//数据成员PublicxxxEventArgs(typename){初始化数据成员}}假如创建的代表名为CharEventHandler,它传递一个CharEventArgs对象。代码:PublicclassCharEventArgs:EventArgs{Publiccharcurrchar;PublicCharEventArgs(charCurrchar){This.Currchar=Currchar;}}3、事件类的代码创建一个引发事件的类,包含事件的声明。事件声明格式:PubliceventxxxEventHandlerEventname;xxxEventHandler//事件代表、Eventname事件实例。例:ClassCharChecker{Charcurr_char;PubliceventCharEventHandlerTestChar;//创建能委托给代表的事件对象Publiccharcurr_char{Get{Returncurr_char;}Set{If(TestChar!=null){CharEventArgsargs=newCharEventArgs(value);TestChar(this,args);//调用事件代表Curr_char=args.CurrChar;}}}}4、创建事件处理程序事件处理程序在事件发生时被通知,事件处理程序是使用代表的格式创建的一个方法。格式:Voidhandlername(objectsource,xxxEventArgsargName){//处理代码。}例:staticvoidDrop_A(objectscource,CharEventArgse){If(e.CurrChar==’a’||e.CurrChar==’A’){Console.WriteLine(“aaaaaaaa”);e.CurrChar=’X’;}}5、将事件处理程序和事件关联起来要将事件处理程序和事件关联起来,必须首先声明一个包含事件的对象。例:CharCheckertester=newCharChecker();要将事件处理程序和事件关联起来使用+=运算符。格式为:oibjectWithEventName.EventObj+=newEventDelegateName(EventName);oibjectWithEventName//事件类声明的对象+=//表示指示器例:Tester.TestChar+=newCharEventHandler(Drop_A);6、实例:usingSystem;delegatevoidCharEventHandler(objectsource,CharEventArgse);//定义代表publicclassCharEventArgs:EventArgs//定义传递事件类{publiccharCurrChar;publicCharEventArgs(charCurrChar){this.CurrChar=CurrChar;}}classCharChecker{charcurr_char;publiceventCharEventHandlerTestChar;//创建事件实例publiccharCurr_Char{get{returncurr_char;}set{if(TestChar!=null){CharEventArgsargs=newCharEventArgs(value);TestChar(this,args);curr_char=args.CurrChar;}}}}classmyApp{staticvoidMain(){CharCheckertester=newCharChecker();tester.TestChar+=newCharEventHandler(Drop_A);tester.Curr_Char='B';Console.WriteLine({0},tester.Curr_Char);tester.Curr_Char='r';Console.WriteLine({0},tester.Curr_Char);tester.Curr_Char='a';Console.WriteLine({0},tester.Curr_Char);tester.Curr_Char='d';Console.WriteLine({0},tester.Curr_Char);}staticvoidDrop_A(objectsource,CharEventArgse){if(e.CurrCh