•类•对象•方法•构造函数•无用单元收集和析构函数•this关键字•小结•类基础–类是定义对象格式的模板,它指定了数据和操作这些数据的代码。–类是面向对象的程序设计的基本构成模块。从定义上讲,类是一种数据结构,这种数据结构可能包含数据成员、函数成员以及其他的嵌套类型。其中数据成员类型有常量、域和事件;函数成员类型有方法、属性、索引指示器、操作符、构造函数和析构函数。–类定义了一个对象的“状态”和“行为”。•类的声明–类的声明就是定义一个新类,格式如下:[属性][类修饰符]class标识符[:基类]{类体;}•类声明包含一组可选的属性(C#使程序员可以创造新的说明性信息种类,称为属性)•一组可选的类修饰符(public;protected;internal;private;abstract;sealed;partial),•partial是2.0版新增加的一个关键字,表明该类只是一个局部类(引入局部类后,就可以将一个大类划分成若干个小局部类,分属于不同的.CS文件中,但都必须属于同一个命名空间)•关键字class和一个命名该类的标识符,接着是一个可选的继承基类//一个建筑物类,它存储建筑物的3种信息:楼层数、总体面积和居住者人数。classBuilding{publicintfloors;//numberoffloorspublicintarea;//totalsquareofbuildingpublicintoccupantss;//numberofoccupants}•类•对象•方法•构造函数•无用单元收集和析构函数•this关键字•小结•实例化–实例化就是创建对象的过程。–使用new关键字来创建•在前面的程序中,下面代码行声明Building类型的对象:–Buildinghouse=newBuilding();•该语句执行2个功能–声明一个称为house的Building类类型的变量–声明语句创建该对象的一个实际的、物理的副本,并将此对象的引用分配给house•house本身不包含对象,它包含对象的引用。•完善Building类–定义两种建筑物信息house和office,然后输出建筑的相关信息,并计算出平均每人的占用面积4-1.cs•对象、对象引用–对象变量保存的仅仅是对象的一个引用,不是对象本身!–这点是非常重要的!有助于理解.NET•引用变量和赋值–在赋值操作中,引用变量的操作不同于数据类型的变量。将一个数值类型变量赋值给另一个数值变量时,操作是直接进行的。当将对象引用变量赋值给另一个引用变量时,情况相对复杂一些。•Buildinghouse1=newBuilding();•Buildinghouse2=house1;–执行赋值语句•house1.area=2600;–下面两个WriteLine都将显示相同值2600•Console.WriteLine(house1.area);•Console.WriteLine(house2.area);•类•对象•方法•构造函数•无用单元收集和析构函数•this关键字•小结•方法–方法是操作类所定义的数据的子程序,并且在许多情况下提供对该数据的访问。通常,程序的其他部分通过类的方法来与类进行互操作–方法包含一个或多个语句,每个方法只执行一个任务–基本形式:accessret-typename(parameter-list){//bodyofmethod}–access为访问修饰符,确定了程序的哪些内容能调用此方法。可以为new、public、protected、internal、private、static、virtual、sealed、override、abstract、extern–如果没有访问修饰符,那么此方法是声明它的类私有的。–ret-type是返回类型,可以是任意合法的类型,如果方法不含有返回值,那么该返回类型就应该为void–parameter-list是由类型和标识符组成的参数的序列,参数之间用“,”隔开,参数可以为空。•给Building类添加方法–分析•人均面积的计算最好通过Build类自身来完成,建筑物的人均面积与area和occupoants两个域有关,Building类封装了这两个域•防止手动计算,避免不必要的代码•通过给计算人均面积的Building添加方法,可以封装Building中直接与建筑物相关的量,从而增强面向对象结构4-2.cs•返回值–虽然具有void返回类型的方法并不少,但大多数方法都有返回值–返回使用下列return形式给调用程序返回数值:•returnvalue;•其中value为返回的值–给Building类的方法添加返回值4-3.cs•参数–调用方法时,可以给方法传递一个或多个数值。传递给方法的数值称为变元。在方法中,接收变元的变量成为参数–参数的作用域限于方法之内–参数在方法名后的括号中声明,其声明语法与变量的声明语法相同–参数可以有一个,也可以有多个,多个参数之间用“,”隔开•给Building添加带参数方法–假设每个居住着必须用一定的最小空间,就能够计算一个建筑物的最多居住者数量,该新方法称为MaxOccupant()–如publicintMaxOccupant(intMinArea){returnarea/MinArea;}4-4.cs•避免产生不可到达代码–创建方法时,在任何环境中都必须避免导致部分代码不能执行的情况。这些代码称为不可到达代码(unreachablecode)。在C#中,这将发布一个警告信息publicvoidm(){if(a==b){return;}else{retrun;}Console.WriteLine(“…”);}•类•对象•方法•构造函数•无用单元收集和析构函数•this关键字•小结•构造函数(constructor)–构造函数在对象创建时初始化对象。其名称与类名相同,而且语法上类似于方法,但是构造函数没有明确的返回类型。–基本形式•accessclass-name()•{–//constructorcode•}–通常,使用构造函数来给由类定义的实例变量赋初始值。另外access通常是public,因为构造函数通常在它所在类之外调用–不论是否定义了构造函数,所有类都有构造函数//AsimpleconstructorusingSystem;classConstructorDemo{publicintx;publicConstructorDemo(){x=10;}}classTest{publicstaticvoidMain(){ConstructorDemocd=newConstructorDemo();Console.WriteLine(cd.x);}}调用构造函数,此时cd.x的值为10。创建对象时,由new调用此构造函数–带参数构造函数•给构造函数添加参数的方式与给方法添加参数的方式相同,只要在构造函数名之后的圆括号中声明他们即可。4-5.cs•给Building类添加构造函数–构造对象时,此构造函数自动初始化floors、area和occupants等域。4-6.cs•类•对象•方法•构造函数•无用单元收集和析构函数•this关键字•小结•无用单元收集–无用单元收集(garbagecollection)•在许多程序设计语言中,分配内存的释放是手动处理的。例如C++中,使用delete运算符来释放被分配的内存。但是,C#使用了不同的,更简单的方式:无用单元收集•C#的无用单元收集系统自动回收对象—不需要任何程序设计人员的介入就能在后台随时进行。工作步骤如下:不存在对象的引用时,就认为该对象不再需要,而且释放它所占用的内存。然后,这些回收的内存能用于随后的再分配。•析构函数–定义一个在无用收集程序进行对象的最后消除之前调用的方法,这是可能的。该方法称为析构函数(destructor),它可以用来确保对象完全结束。–基本形式~class-name(){//destructorcode}–“析构函数是在无用单元收集的紧前面调用”4-7.cs•类•对象•方法•构造函数•无用单元收集和析构函数•this关键字•小结•this关键字–this关键字引用类的当前实例。可用于从构造函数、实例方法和实例访问器中访问成员–由于静态成员函数存在于类一级,并且不是对象的一部分,因此没有this指针。在静态方法中引用this是错误的•限定被相似的名称隐藏的成员,例如:publicEmployee(stringname,stringalias){this.name=name;this.alias=alias;}–将对象作为参数传递到其他方法,例如:CalcTax(this);–声明索引器,例如:publicintthis[intparam]{get{returnarray[param];}set{array[param]=value;}}//keywords_this.cs//thisexampleusingSystem;classEmployee{privatestringname;privatestringalias;privatedecimalsalary=3000.00m;//Constructor:publicEmployee(stringname,stringalias){//Usethistoqualifythefields,nameandalias:this.name=name;this.alias=alias;}//Printingmethod:publicvoidprintEmployee(){Console.WriteLine(Name:{0}\nAlias:{1},name,alias);//PassingtheobjecttotheCalcTaxmethodbyusingthis:Console.WriteLine(Taxes:{0:C},Tax.CalcTax(this));}在本例中,和this用于限定Employee类成员namealias,它们都被相似的名称隐藏。this还用于将对象传递到属于其他类的方法CalcTax。publicdecimalSalary{get{returnsalary;}}}classTax{publicstaticdecimalCalcTax(EmployeeE){return0.08m*E.Salary;}}classMainClass{staticvoidMain(){//Createobjects:EmployeeE1=newEmployee(JohnM.Trainer,jtrainer);//Displayresults:E1.printEmployee();}}•类•对象•方法•构造函数•无用单元收集和析构函数•this关键字•小结•主要介绍了C#中类的基本概念,类的各种组成。C#中的类是对数据结构的封装和抽象,是C#最重要的组成部分。我们利用类定义各种新的数据类型,其中即包含数据内容,又包含对数据内容的操作。•在一个类的实例—对象的生命周期中,最先执行的代码就是类的构造函数。构造函数是用来初始化对象的特殊类型的函数。•无用单元收集和析构函数•this关键字