资源描述
重点内容:数据类型变量和常量运算符流程控制类和对象委托与事件C#4.0的新特性,第2章C#语言快速掌握,一、数据类型,C#中数据类型可以分为值类型和引用类型,如图所示。值类型又可以称为数值类型,其中包含枚举类型(EnumTypes)和结构类型(StructTypes);引用类型包含类类型(ClassTypes)、对象类型(ObjectTypes)、字符串类型(StringTypes)、数组类型(ArrayTypes)、接口类型(InterfaceTypes)和代理类型(DelegateTypes)等。,一、数据类型,一、数据类型,1、值类型,值类型主要由结构和枚举组成,其中结构又可以分为:数值类型、bool类型和用户定义的结构。基于值类型的变量直接包含值(对于这句话,读者在学习完引用类型后会有更深的理解)。将一个值类型变量赋给另一个值类型变量时,将复制包含的值。,一、数据类型,1、值类型,数值类型:数值类型主要包括整数、浮点数和小数。整数:整数类型可以分为无符号型、有符号型和char,其中无符号型包括:byte,ushort,uint和ulong;有符号型包括:sbyte,short,int和long。char在C#中表示16位Unicode字符浮点数:单精度浮点(float)类型和双精度浮点(double)类型。小数:小数(decimal)类型在所有数值类型中精度是最高的,它有128位,一般做精度要求高的金融和货币的计算。,一、数据类型,1、值类型,示例代码:intin=10;/整型charaa=c;/字符串floata=1.0f;/浮点数doubleb=1.0d;/双精度decimaldec=2.2m;/小数类型,一、数据类型,1、值类型,(2)布尔类型布尔(bool)类型表示布尔逻辑量,对应于.NETFramework中定义的System.Boolean类。布尔类型的可能值为true和false(仅有true和false两个布尔值),其中true表示逻辑真,false表示逻辑假。可以直接将true或false值赋给一个布尔变量,或将一个逻辑判断语句的结果赋给布尔类型的变量,一、数据类型,1、值类型,(2)布尔类型,示例代码:booltest=true;boolisBig=1000),4、逻辑运算符,三、运算符,5、条件运算符,C#中唯一的一个三元操作符就是条件运算符(?:),由条件运算符组成的表达式就是条件表达式,条件表达式的一般格式为:操作数1?操作数2:操作数3。,示例代码:inta=3;intb=5;intc=ab?100:-10;,三、运算符,7、运算符的优先级,在C#中为这些运算符定义了不同的优先级,相同优先级的运算符,除了赋值运算符按照从右至做的顺序执行之外,其余运算符按照从左至右的顺序执行。括号是优先级最高的,可以任意的改变符号的计算顺序。在C#中运算符的优先级定义如右表所示,其中1级表示最高优先级,12级表示最低优先级。,7、运算符的优先级,四、流程控制,一般来说,程序代码除了顺序执行之外,对于复杂的工作,为了达到预期的执行结果,还需要使用“流程控制结构”来控制程序的执行。流程控制语句是使用条件表达式来进行判断,以便执行不同的程序代码段,或是重复执行指定的程序代码段。,四、流程控制,1、条件语句,(1)if语句if语句是最常用的分支语句,使用该语句可以有条件地执行其他语句。if语句的最基本使用格式为:if(测试条件)测试条件为true时的代码或者代码块if语句可以和else语句合并执行,使用格式如下:if(测试条件)测试条件为true时的代码或者代码块else测试条件为false时的代码或者代码块,(1)if语句示例staticvoidMain(stringargs)Console.WriteLine(请输入第一个数:);doublevar1=Convert.ToDouble(Console.ReadLine();Console.WriteLine(请输入第二个数:);doublevar2=Convert.ToDouble(Console.ReadLine();stringcomparison;/进行判断,根据var1和var2的值设置comparisonif(var1var2)comparison=小于;elseif(var1=var2)comparison=等于;elsecomparison=大于;/打印结果Console.WriteLine(012,var1,comparison,var2);/暂停程序的执行,给用户机会浏览输出结果Console.WriteLine(nn按回车键退出程序);Console.ReadLine();,四、流程控制,1、条件语句,(2)switch语句switch语句非常类似于if语句,它也是根据测试的值来有条件地执行代码,实际上switch语句完全可以使用if语句代替。一般情况下,如果只有简单的几个分支就需要使用if语句,否则建议使用switch语句,这样可以使代码的执行效率比较高。switch语句的基本语法定义如下:,1、条件语句,switch(测试值)case比较值1:当测试值等于比较值1时要执行的代码break;case比较值2:当测试值等于比较值2时要执行的代码break;.case比较值n:当测试值等于比较值n时要执行的代码break;default:当测试值不等于以上各个比较值时要执行的代码break;,(2)switch语句示例staticvoidMain(stringargs)Console.WriteLine(本系统使用1-7代表一周的每一天,请输入其中一个11.数字,系统将返回该数字代表的星期数。);intvar=Convert.ToInt32(Console.ReadLine();switch(var)case1:Console.WriteLine(您选择的是星期一);break;case2:Console.WriteLine(您选择的是星期二);break;case3:Console.WriteLine(您选择的是星期三);break;case4:Console.WriteLine(您选择的是星期四);break;case5:Console.WriteLine(您选择的是星期五);break;case6:Console.WriteLine(您选择的是星期六);break;case7:Console.WriteLine(您选择的是星期日);break;default:Console.WriteLine(您输入的数字有误,请重新输入);break;Console.WriteLine(n按回车键退出程序);Console.ReadLine();,四、流程控制,2、循环语句,(1)do-while循环do-while语句根据其布尔表达式的值有条件的执行它的嵌套语句一次或者多次,其语法定义如下:do循环代码while(布尔表达式);,四、流程控制,2、循环语句,示例代码:inti=1;doConsole.WriteLine(0,i+);while(i=10);,四、流程控制,2、循环语句,(2)while循环while循环非常类似于do循环,其语法定义如下:while(布尔表达式)循环代码,四、流程控制,2、循环语句,示例代码:inti=1;while(i=10)Console.WriteLine(0,i+);,四、流程控制,2、循环语句,(3)for循环for循环是最常用的一种循环语句,这类循环可以执行指定的次数,并维护它自己的计数器。for语句首先计算一系列初始表达式的值,接下来当条件成立时,执行其嵌套语句,之后计算重复表达式的值并根据其值决定下一步的操作。for循环的语法定义如下:for(循环变量初始化;循环条件;循环操作)循环代码,四、流程控制,2、循环语句,示例代码:for(inti=1;i=10;i+)Console.WriteLine(0,i);,五、类和对象,面向对象的程序设计(OOP:Object-OrientedProgramming)是一种基于结构分析的、以数据为中心的程序设计方法。其主要思想是将数据及处理这些数据的操作都封(Encapsulation)到一个称为类(Class)的数据结构中,使用这个类时,只需要定义一个类的变量即可,这个变量叫做对象(Object)。,1、类,类中包含数据成员(常数、域和事件)、功能成员(方法、属性、索引、操作符、构造函数和析构函数)和嵌套类型。类类型支持继承,派生的类可以对基类进行扩展和特殊化。面向对象的编程方法是程序设计的一次大的进步,程序员跳出了结构化程序设计的传统方法。,五、类和对象,1、类,与传统的面向过程的设计方法相比,采用面向对象的设计方法设计的程序可维护性较好,源程序易于阅读和理解和修改,降低了复杂度。类的可继承特性,使得程序代码可以复用,子类中可以继承祖先类中的部分代码。由于类封装了数据和操作,从类外面看,只能看到公开的数据和操作,而这些操作都在类设计时进行安全性考虑,因而外界操作不会对类造成破坏。,五、类和对象,五、类和对象,1、类,C#中提供了很多标准的类,用户在开发过程中可以使用这些类,这样大大节省了程序的开发时间。C#中也可以自己定义类,类的定义方法为:类修饰符class类名:父类名成员修饰符类的成员变量或者成员函数;,类修饰符,类成员修饰符,2、属性和方法,在C#中,按照类的成员是否为函数将其分为两大类,一种不以函数形式体现,称为成员变量,主要有以下几个类型:常量:代表与类相关的常量值。变量:类中的变量。事件:由类产生的通知,用于说明发生了什么事情。类型:属于类的局部类型。,2、属性和方法,另一种是以函数形式体现,一般包含可执行代码,执行时完成一定的操作,被称为成员函数,主要有以下几个类型:方法:完成类中各种计算或功能的操作,不能和类同名,也不能在前面加“”波浪线符号。方法名不能和类中其他成员同名。,2、属性和方法,属性:定义类的值,并对它们提供读、写操作。索引指示器:允许编程人员在访问数组时,通过索引指示器访问类的多个实例,又称下标指示器。运算符:定义类对象能使用的操作符。构造函数:在类被实例化时首先执行的函数,主要是完成对象初始化操作。构造函数必须和类名相同。析构函数:在类被删除之前最后执行的函数,主要是完成对象结束时的收尾操作。构造函数必须和类名相同,并前加一个“”波浪线符号。,2、属性和方法,属性:定义类的值,并对它们提供读、写操作。索引指示器:允许编程人员在访问数组时,通过索引指示器访问类的多个实例,又称下标指示器。运算符:定义类对象能使用的操作符。构造函数:在类被实例化时首先执行的函数,主要是完成对象初始化操作。构造函数必须和类名相同。析构函数:在类被删除之前最后执行的函数,主要是完成对象结束时的收尾操作。构造函数必须和类名相同,并前加一个“”波浪线符号。,C#中的类成员可以是任意类型,包括数组和集合。当一个类包含了数组和集合成员时,索引器将大大简化对数组或集合成员的存取操作。,五、类和对象,3、对象的创建,构造函数是当类被实例化时首先执行的函数,就是new关键字后面的函数。当创建一个对象时,系统首先给对象分配合适的内存空间,随后系统就自动调用对象的构造函数。因此构造函数是对象执行的入口函数,非常的重要。在定义类时,可以给出构造函数也可以不定义构造函数。如果类中没有构造函数,系统会默认执行System.Object提供的构造函数。,五、类和对象,3、对象的创建,如果要定义构造函数,那么构造函数的函数名必须和类名一样。构造函数的类型修饰符总是公有类型public的,如果是私有类型private的,表示这个类不能被实例化,这通常用于只含有静态成员的类中。构造函数由于不需要显式调用,因而不用声明返回类型。构造函数可以带参数也可以不带参数。具体实例化时,对于带参数的构造函数,需要实例化的对象也带参数,并且参数个数要相等,类型要一一对应。如果是不带参数的构造函数,因而在实例化时对象不具有参数。,3、对象的创建,示例publicclassShapeprotectedstringtype;protecteddoublex,y;publicShape()x=0;y=0;type=形状;publicShape(doublex,doubley)this.x=x;this.y=y;type=形状;publicvirtualdoubleGetArea()returnx*y;publicstringGetShapeType()returntype;,五、类和对象,4、对象的回收,析构函数是当实例对象从内存中删除前最后执行的函数。析构函数是一个实现破坏一个类的实例的行为的成员,和构造函数不同,析构函数在类撤销时运行,常用来处理类用完后的收尾工作。如果在对象在运行过程中动态申请了内存控件,就需要在析构函数中进行回收工作。,五、类和对象,4、对象的回收,析构函数不能带有参数,也不能被继承,不能拥有访问修饰符,并且不能显式地被调用(在该对象被撤销时自动被调用)。一个析构函数声明的标识符必须为声明析构函数的类命名,并要在前面加一个“”符号,如果指定了任何其他名称,就会发生一个错误。,五、类和对象,4、对象的回收,示例classMyClassMyClass()/收尾工作,五、类和对象,5、继承,继承性是面向对象的一个重要特性,C#中支持类的单继承,即只能从一个类继承。继承是传递的,如果C继承了B,并且B继承了A,那么C继承在B中声明的public和protected成员同时也继承了在A中声明的public和protected成员。继承性使得软件模块可以最大限度地复用,并且编程人员还可以对前人或自己以前编写的模块进行扩充,而不需要修改原来的源代码,大大提高了软件的开发效率。,五、类和对象,5、继承,在定义类的时候可以指定要继承的类,语法如下:类修饰符class类名:父类名成员修饰符类的成员变量或者成员函数;派生类是对基类的扩展,派生类可以增加自己新的成员,但不能对已继承的成员进行删除,只能不予使用。基类可以定义自身成员的访问方式,从而决定派生类的访问权限。且可以通过定义虚方法、虚属性,使它的派生类可以重载这些成员,从而实现类的多态性。,五、类和对象,6、多态,类的另外一个特性是多态性,所谓多态性是指同一操作作用于不同类的实例,这些类进行不同的解释,从而产生不同的执行结果的现象。例如假设矩形Rectangle,正方形Square,圆形Circle等类中都定义了一个叫ShowArea的成员函数用于显示其面积,显然当调用不同的对象实例时,会产生不同的结果。,六、委托与事件,1、委托,委托是一种安全地封装方法的类型,它与C和C+中的函数指针类似。与C中的函数指针不同,委托是面向对象的、类型安全的和保险的。委托的类型由委托的名称定义。一个委托可以看作一个特殊的类,因而它的定义可以像常规类一样放在同样的位置。与其他类一样,委托必须先定义以后,再实例化。与类不同的是,实例化的委托没有与之相应的术语(类的实例化称作对象),作为区分我们将实例化的委托称为委托实例。,六、委托与事件,1、委托,下面的示例声明了一个名为Del的委托,该委托可以封装一个采用字符串作为参数并返回void的方法。publicdelegatevoidDel(stringmessage);,1、委托,委托具有以下特点:委托类似于C+函数指针,但它是类型安全的。委托允许将方法作为参数进行传递。委托可用于定义回调方法。委托可以链接在一起;例如,可以对一个事件调用多个方法。方法不需要与委托签名精确匹配,匿名方法允许将代码块作为参数传递,以代替单独定义的方法,六、委托与事件,2、事件,事件是类在发生其关注的事情时用来提供通知的一种方式。例如,封装用户界面控件的类可以定义一个在用户单击该控件时发生的事件。控件类不关心单击按钮时发生了什么,但它需要告知派生类单击事件已发生。然后,派生类可选择如何响应。事件使用委托来为触发时将调用的方法提供类型安全的封装。委托可以封装命名方法和匿名方法。,六、委托与事件,六、委托与事件,2、事件,事件具有以下特点:事件是类用来通知对象需要执行某种操作的方式。尽管事件在其他时候(如信号状态更改)也很有用,事件通常还是用在图形用户界面中。事件通常使用委托事件处理程序进行声明。事件可以调用匿名方法来替代委托。,七、C#4.0的新特性,1.大整数类型BigInteger:是不可变类型,代表一个任意大的整数,其值在理论上已没有上部或下部的界限。2.动态数据类型dynamic:是C#4.0引入了一个新的静态类型,它会告诉编译器,在编译期不去检查dynamic类型,而是在运行时才决定。3.命名参数:命名参数让我们可以在调用方法时指定参数名字来给参数赋值,这种情况下可以忽略参数的顺序。4.可选参数:调用时可以为可选的参数省略参数值。每个可选参数都具有默认值作为其定义的一部分,
展开阅读全文