C#面向对象技术静态(static)类成员静态成员•若将类中的某个成员声明为static该成员称为静态成员。•类中的成员要么是静态要么是非静态的。静态成员由类访问;非静态成员由对象访问。•一般说来静态成员是属于类所有的非静态成员则属于类的实例——对象。•静态方法为类所有,因此不要创建类的实例就可以调用。如System.math类。何时来使用static需要全局数据和代码的时候publicclassGlobals{publicstaticstringUserName;//user’sloginpublicstaticBankCustomer[]Customers;//arrayofcustomerspublicstaticboolTrace;//arewetracing?...publicstaticvoidTraceMsg(stringmsg){if(Globals.Trace)//arewetracing?Ifso,writemsg…{...}}导入(importing)你可以导入名称空间–使用using关键字在文件的顶部导入要使用的名称空间usingTeamX.BusinessTier;...Customerc;c=newCustomer(...);面向对象的程序设计封装对象的原理继承性多态性接口封装对象的原理什么是封装(encapsulation)封装的好处–良好的封装能够减少耦合–类内部的实现可以自由地修改–类具有清晰的对外接口数据隐藏封装性最有用的方式之一实现方法——访问限制修饰符–public无限制,允许任何人来访问–protectedinternal=protected+internal–Internal允许项目或程序内部的类来访问–protected继承时子类可以对基类有完全访问权–private只允许同一个类中的成员访问属性和索引器也用来封装类的细节,并提供公用接口给该类的用户继承性(inheritance)一个类可以有能力直接从另一个类获得其代码和数据派生类从基类那里获得其所有的成员例:GUI设计的Formlookandfeel都是从.NETFormclass继承下来的System.Windows.Forms.FormForm1如何实现继承?publicclassInsuranceAccount:AccountC#中只支持单继承防止继承–publicsealedclassXX–classX{protectedvirtualvoidF(){Console.WriteLine(X.F);}protectedvirtualvoidF2(){Console.WriteLine(X.F2);}}–classY:X{sealedprotectedoverridevoidF(){Console.WriteLine(Y.F);}protectedoverridevoidF2(){Console.WriteLine(X.F3);}}–classZ:Y{protectedoverridevoidF2(){Console.WriteLine(Z.F2);}}如何访问基类成员?派生类可以调用基类的方法–通过使用base关键字–派生类在访问基类的时候有一定的限制,不能访问private的成员;internal的基类成员只能被同一个程序集中的派生类访问publicclassAccount{publicdoublebalance;publicboolWithdraw(doubleamt){balance-=amt;returntrue;}}publicclassCheckAccount:Account{publicboolWithdraw(doubleamt){if(amt=base.balance)returnbase.Withdraw(amt);elsereturnfalse;}}多态性是指在一般类中定义的属性或操作被特殊类继承之后,可以具有不同的数据类型或表现出不同的行为。多态性的作用在于它允许我们开发灵活的系统,我们只要指定什么应该发生,而不是它应该怎样发生,以便获得一个易修改、易变更的系统。多态性(1)面向对象程序设计中的重要概念多态性。–在运行时,可以通过指向基类的引用,来调用实现派生类中的方法。–同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果,这就是多态性。–多态性通过派生类覆写基类中的虚函数型方法来实现。多态性(2)编译时的多态性–编译时的多态性是通过重载来实现的。对于非虚的成员来说,系统在编译时,根据传递的参数、返回的类型等信息决定实现何种操作。运行时的多态性–运行时的多态性就是指直到系统运行时,才根据实际情况决定实现何种操作。–C#中,运行时的多态性通过覆写虚成员实现。多态性Monkeym=newMonkey();Pigeonp=newPigeon();Lionl=newLion();Feederf=newFeeder();f.FeedMonkey();f.FeedPigeon();f.FeedLion();//f.Feed(m);//f.Feed(i);//f.Feed(p);多态性重载(Overload)重载—类中定义的方法可能有不同的版本–publicboolWithdraw(doubleamt,stringname)–publicdoubleWithdraw(doubleamt)特点(两必须一可以)–方法名必须相同–参数列表必须不相同–返回值类型可以不相同虚拟函数声明虚方法–使用virtual关键字publicvirtualboolWithdraw(…);调用虚方法,运行时将确定调用对象是什么类的实例,并调用适当的覆写的方法。虚方法可以有实现体virtual修饰符不能与static、abstract,private或override修饰符一起使用。覆写(Override)子类中为满足自己的需要来重复定义某个方法的不同实现——重写通过使用关键字override来重写–publicoverrideboolWithdraw(…)只有虚方法和抽象方法才能被重写要求:(三相同)–相同的方法名称–相同的参数列表–相同的返回值类型Override&Overload比较ItemsOverride重写Overload重载位置存在于继承关系的类中存在于同一类中方法名相同相同参数列表相同必须不同返回值相同可以不相同抽象方法抽象方法是必须被派生类覆写的方法。抽象方法是可以看成是没有实现体的虚方法如果类中包含抽象方法,那么类就必须定义为抽象类,不论是否还包含其它一般方法publicabstractboolWithdraw(…);委托将方法作为方法的参数Demo接口(1)接口只提供定义实现接口的数据类型必须提供接口成员的实现接口本身可以从多个基接口派生接口(2)使用interface关键字publicinterfaceIAccount{voidMethod1();stringMethod2(intx,inty);.}PublicclassInsuranceAccount:IAccount{voidMethod1(){…}stringMethod2(intx,inty){…}}接口DemointerfaceIA{doubleadd(doublea,doubleb);voidshowMessage();}classA:IA{publicdoubleadd(doublei,doublej){returni+j;}publicvoidshowMessage(){Console.WriteLine(“FromclassA);}}多重继承类与类之间只能是单继承类可以同时实现多个接口类可以继承一个类同时实现多个接口接口可以继承一个或多个接口类同时实现多个接口classTestAClassImplementsMoreInterface{publicstaticvoidMain(String[]args){Aa=newA();a.showMessage(HelloWorld);}}interfaceIA{voidshowMessage(Strings);}interfaceIB{stringMESSAGE=ThisisaStaticMessage;}classA:IA,IB{publicvoidshowMessage(Strings){Console.WriteLine(MESSAGE);Console.WriteLine(s);}}类继承一个类同时实现多个接口classTestClassExtendsClassAndInterface{publicstaticvoidmain(String[]args){Bb=newB();b.showMessage(HelloWorld);}}interfaceIA{StringMESSAGE=ThisisaStaticMessage;}classA{voidshowMessage(Strings){System.out.println(s);}}classB:A,IA{publicvoidshowMessage(Strings){System.out.println(MESSAGE);super.showMessage(s);}}结构结构是值类型而非引用类型使用结构来存储“小类型”可以提高性能structEmployees{publicintEmpID;publicstringEmpName;}Employeesemp;emp.EmpID=1;emp.EmpName=“Tom”;构造函数构造函数用于执行类的实例的初始化每个类都有构造函数。即使我们没有声明它,编译器也会自动地为我们提供一个默认的构造函数。在访问一个类的时候,系统将最先执行构造函数中的语句。与类名相同的方法构造函数可以重载(多个参数不同的构造函数)构造函数构造函数可以有多个或者没有参数对象的集合和组合对象集合数组是有序数据的集合,数组中的每一个元素具有相同的数据类型,可以用一个统一的数组名和下标来唯一确定数组中的元素。a12345a[0]a[1]a[2]a[3]a[4]数组对象数组元素数组元素下标数组int[,]a;a=newint[2,5];int[,]a=newint[2,5];托管堆栈ainttemp=a[0,0];for(inti=0;ia.GetLength(0);i++){for(intj=0;ja.GetLength(1);j++){}}foreach(intiina){}多线程技术应用场景:WinRAR软件Windows搜索功能自动检查英文输入多线程技术线程是程序执行的基本原子单位.一个进程可以由多个线程组成.每个线程都维护异常处理程序、调度优先级和一组系统用于在调度该线程前保存线程上下文的结构。线程上下文包括为使线程在线程的宿主进程地址空间中无缝地继续执行所需的所有信息,包括线程的CPU寄存器组和堆栈。在分布式编程中,正确使用线程能够很好的提高应用程序的性能及运行效率.实现原理是将一个进程分成多个线程,然后让它们并发异步执行,来提高运行效率.并发执行并不是同时执行(占有CPU),任意时刻还是只能有一个线程占用CPU,只不过是它们争夺CPU频繁一些,感觉到他们似乎都在运行.多线程技术要提高对用户的响应速度并且处理所需数据以便几乎同时完成工作,使用多个线程是一种最为强大的技术。在具有一个处理器的计算机上,多个线程可以通过利用用户事件之间很小的时间段在后台处理数据来达到这种效果。无需修改,同一个应用程序在具有多个处理器的计算机上运行时将极大地满足用户的需要。单个应用程序域可以使用多个线程来完成以下任务:1.通过网络与Web服务器和数据库进行通信。2.执行占用大量时间的操作。3.区分具有不同优先级的任务。例如,高优先级线程管理时间关键的任务,低优先级线程执行其他任务。4.使用户界面可以