Cfou语言程序设计基础fou.pptx
第第2章章 C#语言程序设计基础语言程序设计基础内容提要n本本章章主主要要分分析析C#的的语语法法,C#作作为为.NET的原生语言,功能非常强大。的原生语言,功能非常强大。n作作为为ASP.NET的的编编程程基基础础,主主要要分分析析C#的的变变量量、常常量量、控控制制语语句句、C#类类的的基基本本使使用用方方法法、C#的的异异常常处处理理和和C#语语言言面面向对象的高级特性。向对象的高级特性。C#概述nC#是微软公司专门为.NET量身定做的编程语言,它与.NET有着密不可分的关系。nC#的类型就是.NET框架所提供的类型,C#本身并无类库,而是直接使用.NET框架所提供的类库。n另外,类型安全检查、结构化异常处理也都是交给CLR处理的。因此,C#是最适合开发.NET应用的编程语言。C#的特点nC#不仅具有C+的强大功能,而且具有VisualBasic简单易用的特性。C#的语法与C+基本相同。如果以前对C+非常熟悉的话,学习C#则是一件非常容易的事情。n默认情况下,C#代码在.NET框架提供的受控环境下运行,不允许直接操作内存。它带来最大的变化是C#没有了C和C+中的指针。与此相关的,那些在C+中被大量使用的指针操作符已经不再出现。C#只支持一个“.”C#程序结构案例名称:第一个案例名称:第一个C#程序程序程序名称:程序名称:2-01.csusingSystem;classHellopublicstaticvoidMain()Console.WriteLine(您好!);C#编译器n.NETFrameworkSDK内置了C#编译器“csc.exe(CSharpCompiler)”,该文件在“WINNTMicrosoft.NETFrameworkv版本号”目录下。n如果不能执行该命令,需要将该目录添加到操作系统的PATH变量中。可以在命令窗口编译C#文件,假如要编译名为1-01.cs的C#文件。命令行的语法为:ncsc2-01.cs不用不用using导入名字空间导入名字空间案例名称:不用案例名称:不用using导入名字空间导入名字空间程序名称:程序名称:2-02.csclassHellopublicstaticvoidMain()System.Console.WriteLine(您好!);程序的输入和输出案例名称:利用案例名称:利用ReadLine()读入数据读入数据程序名称:程序名称:2-03.csusingSystem;classHellopublicstaticvoidMain()Console.Write(“请输入你的名字:”);stringstr_bookName=Console.ReadLine();Console.WriteLine(您好!0,str_bookName);命令行参数案例名称:使用命令行参数案例名称:使用命令行参数程序名称:程序名称:2-04.csusingSystem;publicclassHellopublicstaticvoidMain(stringargs)Console.WriteLine(你共有0个朋友,args.Length);Console.WriteLine(你的朋友列表为:);for(inti=0;iargs.Length;i+)Console.WriteLine(Arg0=1,i,argsi);C#注释案例名称:使用注释案例名称:使用注释程序名称:程序名称:2-05.csusingSystem;classHellostaticvoidMain()/*声明一个DateTime变量t并将当前日期赋给t*/DateTimet=DateTime.Today;stringstr_Time;/声明一个字符串变量str_Timestr_Time=t.ToLongDateString();Console.WriteLine(当前日期是:0,str_Time);C#的数据结构nC#的数据类型分为值类型(ValueType)和引用类型(ReferenceType)两大类。n值类型包括简单类型(SimpleType)、结构类型(StructType)和枚举类型(EnumType)3种。引用类型包括类类型(ClassType)、数组类型(ArrayType)和代表类型(DelegateType)。变量和常量nC#是大小写敏感的,即大写和小写字母认为是不同的字母。例如变量名something,Something,SOMETHING都是不同的名字。n命名变量名要遵守如下的规则:n不能是C#关键字。n第一个字符必须是字母或下划线。n不要太长,一般不超过31个字符为宜。n不能以数字开头n中间不能有空格n变量名中不能包含“.;,”+-”之类的特殊符号。实际上,变量名中除了能使用26个英文大小写字母和数字外,只能使用下划线“_”。n变量名不要与C+中的库函数名、类名和对象名相同。使用常量使用常量案例名称:使用常量案例名称:使用常量程序名称:程序名称:2-06.csusingSystem;classHellopublicconstdoublePI=3.14159265;staticvoidMain()Console.WriteLine(“圆周率PI的值为0”,PI);值类型n值类型,也称为简单类型,是直接由一系列元素构成的数据类型。nC#语言中提供了一组已经定义好了简单类型。n可以分为整整类型、布尔类型、字符类型和实数类型。整整类型n整整类型的变量的值为整数。计算机的存储单元是有限的,所以计算机语言提供的整数类型的值总是在一定的范围之内。nC#中有九种整数类型,这些整数类型在数学上的表示以及在计算机中的取值范围如表2-1所示。整整整整类类型型整整类型特征取值类型sbyte有符号8位整数-128-127byte无符号8位整数0-255short有符号16位整数-32768-32767ushort无符号16位整数0-65535int有符号32位整数-2147483648-2147483647uint无符号32位整数0-4294967295long有符号64位整数-9223372036854775808-9223372036854775807ulong无符号64位整数0-18446744073709551615使用整整类型使用整整类型案例名称:使用整整类型案例名称:使用整整类型程序名称:程序名称:2-07.csusingSystem;classHellopublicstaticvoidMain()shortx=32766;x+;Console.WriteLine(x);x+;Console.WriteLine(x);布尔类型n布尔类型是用来表示“真”和“假”的。布尔类型表示的逻辑变量只有两种取值。在C#中,分别采用true和false两个值来表示。n在C语言中,用0来表示“假”,其他任何非零的值表示真。在C#中,布尔型变量只能是true或者false。实数类型n实数在C#中采用两种数据类型来表示:单精度(float)和双精度(double)。它们的区别在于取值范围和精度不同。n单精度:取值范围在正负1.5*10-45到3.4*1038之间,精度为七位。n双精度:取值范围在正负5.0*10-324到1.7*10308之间,精度为15-16位。字符类型n字符包括数字字符、英文字母和表达符号等等,C#提供的字符类型按照国际标准,采用Unicode字符集。一个Unicode的标准字符长度为16位,用它可以来表示世界上大多数语言。给一个变量赋值的语法为:ncharmychar=M;n也可以直接通过十六进制或者Unicode赋值。ncharmychar=x0034;/mychar=4ncharmychar=u0039;/mychar=9枚举类型案例名称:使用枚举类型案例名称:使用枚举类型程序名称:程序名称:2-09.csusingSystem;enumWeekDaySunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday;classTeststaticvoidMain()WeekDayday;/声明WeekDay的实例day;day=WeekDay.Sunday;Console.WriteLine(day的值是0,day);引用类型nC#中的另一大数据类型是引用类型。“引用”的含义是:该类型的变量不直接存储所包含的值,而是存储所要存储值的地址。nC#中的引用类型有四种:类、数组、代表和接口。类n类是面向对象编程的基本单位,是一种包含数据成员、函数成员的数据结构。类的数据成员有变量、域和事件。函数成员包括方法、属性、构造函数和析构函数等等。类和结构同样都包含了自己的成员,但他们之间最主要在于:类是引用类型,而结构是值类型。n类支持继承机制,通过继承,派生可以扩展类的数据成员和函数方法,进而达到代码重用和设计重用的目的。数组案例名称:使用数组类型案例名称:使用数组类型程序名称:程序名称:2-10.csusingSystem;classteststaticvoidMain()intarr1=newint2;intarr2=newint1,2,3;stringarr3=six,is,me;int,arr4=1,2,3,4;int,arr5=newint3,4;for(inti=0;iarr1.Length;i+)arr1i=i*i*i;Console.WriteLine(arr10=1,i,arr1i);for(inti=0;i4;i+)for(intj=0;j3;j+)arr5j,i=i*j;Console.WriteLine(arr50,1=2,j,i,arr5j,i);代表程序名称:使用代表程序名称:使用代表程序名称:程序名称:2-11.csusingSystem;delegateintmydelegate();classmyclasspublicintInstMethod()Console.WriteLine(CalltheInstMethod.);return0;classTeststaticpublicvoidMain()myclassp=newmyclass();mydelegated=newmydelegate(p.InstMethod);d();/指代p.InstMethod接口n接口描述了组件对外提供的服务。在组件和组件之间、组件和客户之间都通过接口进行交互。n因此组件一旦发布,它只能通过预先定义的接口来处理合理的、一致的服务。操作符与控制语句n表达式由操作数和操作符来构造。表达式的操作符指示出对操作数采取哪种操作。操作符的例子包括+、-、*、/和new。操作数的例子包括文字、域、局部变量和表达式。n有三种类型的操作符:n一元操作符。一元操作符有一个操作数并且或是使用前缀符号(例如-x)或是使用后缀符号(例如x+)。n二元操作符。二元操作符有两个操作数并且使用中间符号(例如x+y)。n三元操作符。只有一个三元操作符?:。三元操作符有三个操作数并且使用中间符号(c?x:y)。算术操作符案例名称:使用算术操作符案例名称:使用算术操作符程序名称:程序名称:2-13.csusingSystem;enumWeekdaySunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday;classteststaticvoidMain()stringmystr1=你好!;stringmystr2=小刘;stringmystr3=mystr1+mystr2;Weekdayd1=Weekday.Sunday;Weekdayd2=d1+3;Console.WriteLine(d1=0,d2=1,d1,d2);Console.WriteLine(mystr3);赋值操作符n赋值就是给一个变量传一个新的值。在C#中,赋值分为简单赋值和复合赋值两大类。n操作符“=”是简单赋值操作符号。复合赋值操作符号包括+=、-=、*=、/=、%=、|=、/、=。逻辑操作符nC#提供的逻辑运算符有三个,就是逻辑与(&)、逻辑或(|)和逻辑非(!)。n其中,逻辑与和逻辑或是二元操作符,要求有两个操作数;而逻辑非是一元操作符,只要求一个操作数。分支语句n分支语句依据一个控制表达式的值,从一系列可能被执行的语句选择出要执行的语句。n包括两种语句:if语句和switch语句。使用使用if语句语句案例名称:使用案例名称:使用if语句语句程序名称:程序名称:2-14.csusingSystem;classHellopublicstaticvoidMain()Console.Write(请输入你的名字:);stringstr_userName=Console.ReadLine();if(str_userName=six)Console.WriteLine(您好!0,哎呀,是您啊!,str_userName);elseConsole.WriteLine(0是哪棵葱?,str_userName);switch语句案例名称:使用案例名称:使用switch语句语句程序名称:程序名称:2-15.csusingSystem;classSamplepublicstaticvoidMain()intmyage=10;stringmystr;switch(myage)case10:mystr=还是小孩!;break;case25:mystr=可以结婚了!;break;default:mystr=不对吧!你到底多大!;break;Console.WriteLine(小子,你0,mystr);循环语句n在C#中可使用循环语句有4种格式:ndo-while:当(或直到)条件为True时循环。nwhile:当条件为True时循环。nfor:指定循环次数,使用计数器重复运行语句。nforeach:对于集合中的每项或数组中的每个元素,重复执行。do-while循环案例名称:案例名称:do-while循环循环程序名称:程序名称:2-16.csusingSystem;classtestpublicstaticvoidMain()intsum=0;/初始值设置为0inti=1;/加数初始值为1dosum+=i;i+;while(i=100);Console.WriteLine(从0到100的和是0,sum);While循环案例名称:使用案例名称:使用while语句语句程序名称:程序名称:2-17.csusingSystem;classSamplepublicstaticvoidMain()intsum=0;inti=1;while(i=100)sum+=i;i+;Console.WriteLine(从0到100的和是0,sum);For循环案例名称:使用案例名称:使用案例名称:使用案例名称:使用forfor语句语句语句语句程序名称:程序名称:程序名称:程序名称:2-18.cs2-18.cs usingSystem;usingSystem;classtestclasstestpublicstaticvoidMain()publicstaticvoidMain()intsum=0;intsum=0;for(inti=1;i=100;i+)for(inti=1;i100)break;if(j100)break;sum+=j;sum+=j;j+;j+;Console.WriteLine(Console.WriteLine(从从0 0到到100100的和是的和是0,sum);0,sum);跳转语句n跳转语句进行无条件跳转。n常用的跳转语句:break语句和continue语句。break语句nbreak语句跳出包含它的switch,while,do,for,或for-each语句。假如break不是在switch,while,do,for或者for-each语句的块中,将会发生编译错误。案例名称:使用案例名称:使用break语句语句程序名称:程序名称:2-19.csusingSystem;classtestpublicstaticvoidMain()intsum=0;inti=1;while(true)sum+=i;i+;if(i100)break;/如果i大于100,则退出循环Console.WriteLine(从0到100的和是0,sum);continue语句n案例名称:使用案例名称:使用continue语句语句n程序名称:程序名称:2-20.csnnusingSystem;nclasstestnpublicstaticvoidMain()nfor(intn=100;n=200;n+)nif(n%3=0)ncontinue;nConsole.WriteLine(从100到200的不能被3整除的数是0,n);nnn异常处理nC#的异常可能由两种方式导致:nthrow语句无条件抛出异常。nC#语句和表达式执行过程中激发了某个异常的条件,使得操作无法正常结束,从而引发异常。例如整数除法操作分母为零时将抛出一个异常。n异常由try语句来处理,try语句提供了一种机制来捕捉执行过程中发生的异常。Try语句有3种基本格式:ntry-catchntry-finallyntry-catch-finallytry-catch结构案例名称:使用案例名称:使用try-catch语句语句程序名称:程序名称:2-21.csusingSystem;classSamplepublicstaticvoidMain(stringargs)longfactorial=1;longnum=Int64.Parse(args0);trychecked/计算数num的阶乘for(longcur=1;cur=num;cur+)factorial*=cur;catch(OverflowExceptionoe)Console.WriteLine(计算0的阶乘时引发溢出异常,num);Console.WriteLine(0,oe.Message);return;Console.WriteLine(0的阶乘是1,num,factorial);try-finally结构案例名称:使用案例名称:使用try-finally语句语句程序名称:程序名称:2-22.csusingSystem;publicclassSamplepublicstaticvoidMain()tryConsole.WriteLine(执行try子句!);gotoleave;/跳转到leave标签finallyConsole.WriteLine(执行finally子句!);leave:Console.WriteLine(执行leave标签!);try-catch-finally结构案例名称:使用案例名称:使用try-catch-finally语句语句程序名称:程序名称:2-23.csusingSystem;classSamplepublicstaticvoidMain()trythrow(newArgumentNullException();/引发异常catch(ArgumentNullExceptione)Console.WriteLine(Exception:0,e.Message);finallyConsole.WriteLine(执行finally子句);C#面向对象程序设计基础n与传统的面向过程的编程方法相比,面向对象编程方法有3个优点:n(1)程序的可维护性好;(2)程序容易修改;(3)对象可以使用多次,可重用性好。类的定义classAclassBvoidf()Aa=newA();继承n为了提高软件模块的可重用性和可扩充性,以便提高软件的开发效率,希望能够利用前人或自己以前的开发成果,任何面向对象的程序设计语言都能够提供两个重要的特性:n继承性(inheritance)n多态性(polymorphism)。使用继承使用继承案例名称:使用继承案例名称:使用继承程序名称:程序名称:2-24.csusingSystem;classBaseApublicvoidFuncA()System.Console.WriteLine(FuncitonA);classDerivedA:BaseApublicvoidFuncB()System.Console.WriteLine(FunctionB);classTesterpublicstaticvoidMain(stringargs)DerivedAaDerived=newDerivedA();aDerived.FuncA();aDerived.FuncB();类的访问修饰符案例名称:类的访问修饰符案例名称:类的访问修饰符程序名称:程序名称:2-25.csusingSystem;classClass1publicstrings;/公有成员protectedinti;/保护成员privatedoubled;/私有成员publicvoidF1()s=Welcomesix!;/正确,允许访问自身成员i=100;/正确,允许访问自身成员d=18.68;/正确,允许访问自身成员构造函数和析构函数n构造函数用于执行类的实例的初始化。每个类都有构造函数,即使没有声明它,编译器也会自动提供一个默认的构造函数。在访问一个类的时候,系统将最先执行构造函数中的语句。使用构造函数请注意以下几个问题:n一个类的构造函数通常与类名相同n构造函数不声明返回类型。n构造函数总是public类型的。案例名称:构造函数和析构函数案例名称:构造函数和析构函数程序名称:程序名称:2-26.csusingSystem;classDesk/构造函数和类名一样,析构函数前面加publicDesk()Console.WriteLine(ConstructingDesk);weight=6;high=3;width=7;length=10;Console.WriteLine(0,1,2,3,weight,high,width,length);Desk()Console.WriteLine(DestructingDesk);protectedintweight;protectedinthigh;protectedintwidth;protectedintlength;publicstaticvoidMain()Deskaa=newDesk();Console.WriteLine(backinmain();this关键字案例名称:使用案例名称:使用this关键字关键字程序名称:程序名称:2-27.csusingSystem;publicclassEmployeepublicstringname;/员工姓名publicdecimalsalary;/员工薪水/构造函数publicEmployee(stringname,decimalsalary)/用this关键字给正在构造的对象的name和salary赋值this.name=name;this.salary=salary;/显示员工姓名及薪水publicvoidDiaplayEmployee()Console.WriteLine(姓名:0,name);Console.WriteLine(薪水:0元,salary);/用this方法将当前对象传给Tax.CalcTax()方法Console.WriteLine(个人所得税:0元,Tax.CalcTax(this);publicclassTaxpublicstaticdecimalCalcTax(EmployeeE)return(0.14m*(E.salary-800.0m);publicclassSamplepublicstaticvoidMain()/声明类Employee的实例eEmployeee=newEmployee(小刘,4123.6m);e.DiaplayEmployee();/显示员工姓名和薪水关键字static案例名称:使用案例名称:使用static关键字关键字程序名称:程序名称:2-28.csusingSystem;publicclassPersonprivateintid;publicstaticinttotal=0;publicPerson()total+;id=total;publicclassOtherClasspublicstaticvoidMain()Person.total=100;Console.WriteLine(Person.total);Personc=newPerson();Console.WriteLine(Person.total);案例名称:使用静态方法案例名称:使用静态方法程序名称:程序名称:2-29.csusingSystem;publicclassPersonprivateintid;privatestaticinttotal=0;publicstaticintgetTotalPerson()returntotal;publicPerson()total+;id=total;publicclassTestPersonpublicstaticvoidMain()Console.WriteLine(Person.getTotalPerson();Personp1=newPerson();Console.WriteLine(Person.getTotalPerson();C#面向对象高级特性n和其他的面向对象语言一样,C#支持多态、虚方法、函数的重载等。n除此之外,C#还提供一种特殊的数据形态“装箱”多态(Polymorphism)n在C#中,多态性的定义是:“同一操作作用于不同的类的实例,不同的类将进行不同的解释,最后产生不同的执行结果”。C#支持两种类型的多态性。n编译时的多态性:编译时的多态是通过重载来实现的。对于非虚的成员来说,系统在编译时,根据传递的参数、返回的类型等信息决定实现何种操作。n运行时的多态性:运行时的多态性是直到系统运行时,才根据实际情况决定实现何种操作。C#中,运行时的多态性通过虚方法实现。n编译时的多态性提供了运行速度快的特点,而运行时的多态性则带来了高度灵活和抽象的特点。虚方法案例名称:使用虚方法案例名称:使用虚方法程序名称:程序名称:2-30.csusingSystem;classTeststaticvoidMain(stringargs)Baseb=newBase();b.Draw();Derivedd=newDerived();d.Draw();d.Fill();Baseobj=newDerived();obj.Fill();obj.Draw();classBasepublicvoidFill()System.Console.WriteLine(Base.Fill);publicvirtualvoidDraw()System.Console.WriteLine(Base.Draw);classDerived:BasepublicoverridevoidDraw()System.Console.WriteLine(Derived.Draw);publicnewvoidFill()System.Console.WriteLine(Derived.Fill);抽象类案例名称:使用抽象类案例名称:使用抽象类程序名称:程序名称:2-31.csusingSystem;abstractpublicclassWindowpublicWindow(inttop,intleft)this.top=top;this.left=left;abstractpublicvoidDrawWindow();protectedinttop;protectedintleft;publicclassListBox:WindowpublicListBox(inttop,intleft,stringcontents):base(top,left)/调用基类的构造函数listBoxContents=contents;publicoverridevoidDrawWindow()Console.WriteLine(Writingstringtothelistbox:0,listBoxContents);privatestringlistBoxContents;publicclassTesterstaticvoidMain()WindowwinArray=newWindow3;winArray0=newListBox(1,2,FirstListBox);winArray1=newListBox(3,4,SecondListBox);for(inti=0;i2;i+)winArrayi.DrawWindow();函数重载案例名称:重载普通函数案例名称:重载普通函数程序名称:程序名称:2-32.csusingSystem;classOverloadpublicvoidFunc()System.Console.WriteLine(Func();publicvoidFunc(intx,inty)System.Console.WriteLine(Func(intx,inty);publicvoidFunc(longx,longy)System.Console.WriteLine(Func(longx,longy);publicstaticvoidMain(stringargs)OverloadmyOverload=newOverload();myOverload.Func();myOverload.Func(1,1);myOverload.Func(1L,1L);/会调用哪个重载函数呢?myOverload.Func(1L,1);案例名称:重载构造函数案例名称:重载构造函数程序名称:程序名称:2-33.csusingSystem;classCtorOverloadDemostaticvoidMain(Stringargs)MyInti=newMyInt(2);System.Console.WriteLine(i.i);MyIntj=newMyInt();System.Console.WriteLine(j.i);classMyIntpublicinti;publicMyInt()i=0;publicMyInt(inti)this.i=i;装箱案例名称:使用装箱案例名称:使用装箱程序名称:程序名称:2-34.csusingSystem;publicclassUnboxingTestpublicstaticvoidMain()inti=123;/装箱objecto=i;/拆箱,必须是显示转换intj=(int)o;Console.WriteLine(j:0,j);常用的几个函数n字符串输出n把数据转化成字符串以作为输出实际上是很简单的。数值类型转换为字符串可以用nintintAge=25;nstringstrAge=intAge.ToString();nToString()函数可以应用于所有数据类型.NETFramework基类库函数。这是因为ToString()是.NETFrameWork库System.Object的基类的函数之一。函数功能Convert.ToBoolean()转换成为bool型,字符串必须为true或者falseConvert.ToChar()转换成为char型Convert.ToDateTime()转换成为日期型Convert.ToDecimal()转换成为Decimal型Convert.ToInt32()转换成为int型字符串处理函数案例名称:使用字符串函数案例名称:使用字符串函数程序名称:程序名称:2-35.csusingSystem;publicclassUnboxingTestpublicstaticvoidMain()stringstrDate=2005-10-110:10:55;stringstrDay=strDate.Substring(0,strDate.IndexOf();Console.WriteLine(输出日期:0,strDay);小结n本章介绍C#编程基础,掌握C#编译器的使用方法,掌握C#的数据结构,熟悉值类型和引用类型的使用方法。n掌握操作符和控制语句的使用,着重掌握C#的异常处理和C#面向对象编程特性,熟悉C#常用的几个函数。本章习题n2-1 简述简述C#语言的特点。语言的特点。n2-2 如何读取命令行参数?用程序说明。如何读取命令行参数?用程序说明。n2-3 比较基本数据类型和引用数据类型的区别。比较基本数据类型和引用数据类型的区别。n2-4 C#的访问修饰符有几种,各具有什么限定作用?的访问修饰符有几种,各具有什么限定作用?n2-5 构造函数有什么作用?简述重载构造函数的好处。构造函数有什么作用?简述重载构造函数的好处。n2-6 析构函数有什么作用?如何定义析构函数?析构函数有什么作用?如何定义析构函数?n2-7 如何访问基类的函数?如何访问基类的函数?n2-8 C#中如何实现异常处理?中如何实现异常处理?演讲完毕,谢谢观看!