C#入门经典第三版(最新)(4)

2019-03-27 20:47

乘除后加减是一致的。1.5.1节中的表总结了所有操作符从高到低的优先级顺序。

当两个有相同优先级的操作符对操作数进行运算时,例如x+y-z,操作符按照出现的顺序由左至右执行,x+y-z按(x+y)-z进行求值。赋值操作符按照右接合的原则,即操作按照从右向左的顺序执行。如x=y=z按照x=(y=z)进行求值。建议在写表达式的时候,如果无法确定操作符的实际顺序,则尽量采用括号来保证运算的顺序,这样也使得程序一目了然,而且自己在编程时能够思路清晰。 1.6 程序控制语句

C#语言控制语句和C基本相同,使用方法基本一致。C#语言控制语句包括:if语句、swith语句、while语句、do?while语句、for语句、foreach语句、break语句、continue语句、goto语句、return语句、异常处理语句等,其中foreach语句和异常语句是C#语言新增加控制语句。本节首先介绍一下这些语句和C语言的不同点,然后介绍C#语言新增的控制语句。 1.6.1 和C语言的不同点

? 与C不同,if语句、while语句、do?while语句、for语句中的判断语句,一定要用布尔表达式,不能认为0为false,其它数为true。

? switch语句不再支持遍历,C和C++语言允许switch语句中case标签后不出现break语句,但C#不允许这样,它要求每个case标签项后使用break语句或goto跳转语句,即不允许从一个case自动遍历到其它case,否则编译时将报错。switch语句的控制类型,即其中控制表达式的数据类型可以是sbyte、byte、short、ushort、uint、long、ulong、char、string或枚举类型。每个case标签中的常量表达式必须属于或能隐式转换成控制类型。如果有两个或两个以上case标签中的常量表达式值相同,编译时将会报错。执行switch语句,首先计算switch表达式,然后与case后的常量表达式的值进行比较,执行第一个与之匹配的case分支下的语句。如果没有case常量表达式的值与之匹配,则执行dafault分支下的语句,如果没有dafault语句,则退出switch语句。switch语句中可以没有dafault语句,但最多只能有一个dafault语句。见下例: using System; class class1

{ static void Main()

{ System.Console.WriteLine(\请输入要计算天数的月份\string s=System.Console.ReadLine(); string s1=\switch(s)

{ case \

case \ case \共用一条语句 s1=\ case \

s1=\case \

goto case \语句仅为说明问题,无此必要 case \

s1=\default:

s1=\输入错误\}

System.Console.WriteLine(s1); } }

1.6.2 foreach语句

foreach语句是C#语言新引入的语句,C和C++中没有这个语句,它借用Visual Basic中的foreach语句。语句的格式为:

foreach(类型 变量名 in 表达式) 循环语句 其中表达式必须是一个数组或其它集合类型,每一次循环从数组或其它集合中逐一取出数据,赋值给指定类型的变量,该变量可以在循环语句中使用、处理,但不允许修改变量,该变量的指定类型必须和表达式所代表的数组或其它集合中的数据类型一致。例子: using System; class Test()

{ public static void Main()

{ int[] list={10,20,30,40};//数组 foreach(int m in list)

Console.WriteLine(\} }

对于一维数组,foreach语句循环顺序是从下标为0的元素开始一直到数组的最后一个元素。对于多维数组,元素下标的递增是从最右边那一维开始的。同样break和continue可以出现在foreach语句中,功能不变。 1.6.3 异常语句

在编写程序时,不仅要关心程序的正常操作,还应该考虑到程序运行时可能发生的各类不可预期的事件,比如用户输入错误、内存不够、磁盘出错、网络资源不可用、数据库无法使用等,所有这些错误被称作异常,不能因为这些异常使程序运行产生问题。各种程序设计语言经常采用异常处理语句来解决这类异常问题。

C#提供了一种处理系统级错误和应用程序级错误的结构化的、统一的、类型安全的方法。C#异常语句包含try子句、catch子句和finally子句。try子句中包含可能产生异常的语句,该子句自动捕捉执行这些语句过程中发生的异常。catch子句中包含了对不同异常的处理代码,可以包含多个catch子句,每个catch子句中包含了一个异常类型,这个异常类型必须是System.Exception类或它的派生类引用变量,该语句只扑捉该类型的异常。可以有一个通用异常类型的catch子句,该catch子句一般在事先不能确定会发生什么样的异常的情况下使用,也就是可以扑捉任意类型的异常。一个异常语句中只能有一个通用异常类型的catch子句,而且如果有的话,该catch子句必须排在其它catch子句的后面。无论是否产生异常,子句finally一定被执行,在finally子句中可以增加一些必须执行的语句。

异常语句捕捉和处理异常的机理是:当try子句中的代码产生异常时,按照catch子句的顺序查找异常类型。如果找到,执行该catch子句中的异常处理语句。如果没有找到,执行通用异常类型的catch子句中的异常处理语句。由于异常的处理是按照catch子句出现的顺序逐一检查catch子句,因此catch子句出现的顺序是很重要的。无论是否产生异常,一定执行finally子句中的语句。异常语句中不必一定包含所有三个子句,因此异常语句可以有以下三种可能的形式:

? try –catch语句,可以有多个catch语句 ? try -finally语句

? try -catch-finally语句,可以有多个catch语句

请看下边的例子:

1. try–catch-finally语句 using System

using System.IO//使用文件必须引用的名字空间 public class Example

{ public static void Main()

{ StreamReader sr=null;//必须赋初值null,否则编译不能通过 try

{ sr=File.OpenText(\可能产生异常 string s;

while(sr.Peek()!=-1)

{ s=sr.ReadLine();//可能产生异常 Console.WriteLine(s); } }

catch(DirectoryNotFoundException e)//无指定目录异常 { Console.WriteLine(e.Message); }

catch(FileNotFoundException e)//无指定文件异常

{ Console.WriteLine(\文件\未被发现\ }

catch(Exception e)//其它所有异常

{ Console.WriteLine(\处理失败:{0}\ }

finally

{ if(sr!=null) sr.Close(); } } }

2. try -finally语句

上例中,其实可以不用catch语句,在finally子句中把文件关闭,提示用户是否正确打开了文件,请读者自己完成。 3. try -catch语句

请读者把上例修改为使用try-catch结构,注意在每个catch语句中都要关闭文件。 1.7 类的继承

在1.3节,定义了一个描述个人情况的类Person,如果我们需要定义一个雇员类,当然可以从头开始定义雇员类Employee。但这样不能利用Person类中已定义的函数和数据。比较好的方法是,以Person类为基类,派生出一个雇员类Employee,雇员类Employee继承了Person类的数据成员和函数成员,既Person类的数据成员和函数成员成为Employee类的成员。这个Employee类叫以Person类为基类的派生类,这是C#给我们提出的方法。C#用继承的方法,实现代码的重用。

1.7.1 派生类的声明格式 派生类的声明格式如下:

属性 类修饰符 class 派生类名:基类名 {类体} 雇员类Employee定义如下:

class Employee:Person//Person类是基类

{ private string department;//部门,新增数据成员 private decimal salary;//薪金,新增数据成员

public Employee(string Name,int Age,string D,decimal S):base(Name,Age) {//注意base的第一种用法,根据参数调用指定基类构造函数,注意参数的传递 department=D; salary=S; }

public new void Display()//覆盖基类Display()方法,注意new,不可用override { base.Display();//访问基类被覆盖的方法,base的第二种用法

Console.WriteLine(\部门:{0} 薪金:{1}\ } }

修改主函数如下: class Class1

{ static void Main(string[] args)

{ Employee OneEmployee=new Employee(\李四\计算机系\OneEmployee.Display(); } }

Employee类继承了基类Person的方法SetName()、SetAge(),数据成员name和age,即认为基类Person的这些成员也是Employee类的成员,但不能继承构造函数和析构函数。添加了新的数据成员department和salary。覆盖了方法Display()。请注意,虽然Employee类继承了基类Person的name和age,但由于它们是基类的私有成员,Employee类中新增或覆盖的方法不能直接修改name和age,只能通过基类原有的公有方法SetName()和SetAge()修改。如果希望在Employee类中能直接修改name和age,必须在基类中修改它们的属性为protected。

1.7.2 base 关键字

base关键字用于从派生类中访问基类成员,它有两种基本用法:

? 在定义派生类的构造函数中,指明要调用的基类构造函数,由于基类可能有多个构造函数,根据base后的参数类型和个数,指明要调用哪一个基类构造函数。参见上节雇员类Employee构造函数定义中的base的第一种用法。

? 在派生类的方法中调用基类中被派生类覆盖的方法。参见上节雇员类Employee的Display()方法定义中的base的第二种用法。 1.7.3 覆盖基类成员

在派生类中,通过声明与基类完全相同新成员,可以覆盖基类的同名成员,完全相同是指函数类型、函数名、参数类型和个数都相同。如上例中的方法Display()。派生类覆盖基类成员不算错误,但会导致编译器发出警告。如果增加new修饰符,表示认可覆盖,编译器不再发出警告。请注意,覆盖基类的同名成员,并不是移走基类成员,只是必须用如下格式访问基类中被派生类覆盖的方法:base.Display()。 1.7.4 C#语言类继承特点 C#语言类继承有如下特点:

? C#语言只允许单继承,即派生类只能有一个基类。

? C#语言继承是可以传递的,如果C从B派生,B从A派生,那么C不但继承B的成员,还要继承A中的成员。

? 派生类可以添加新成员,但不能删除基类中的成员。

? 派生类不能继承基类的构造函数、析构函数和事件。但能继承基类的属性。

? 派生类可以覆盖基类的同名成员,如果在派生类中覆盖了基类同名成员,基类该成员在派生类中就不能被直接访问,只能通过base.基类方法名访问。

? 派生类对象也是其基类的对象,但基类对象却不是其派生类的对象。例如,前边定义的雇员类Employee是Person类的派生类,所有雇员都是人类,但很多人并不是雇员,可能是学生,自由职业者,儿童等。因此C#语言规定,基类的引用变量可以引用其派生类对象,但派生类的引用变量不可以引用其基类对象。 1.8 类的成员

由于C#程序中每个变量或函数都必须属于一个类或结构,不能象C或C++那样建立全局变量,因此所有的变量或函数都是类或结构的成员。类的成员可以分为两大类:类本身所声明的以及从基类中继承来的。 1.8.1 类的成员类型 类的成员包括以下类型:

? 局部变量:在for、switch等语句中和类方法中定义的变量,只在指定范围内有效。 ? 字段:即类中的变量或常量,包括静态字段、实例字段、常量和只读字段。 ? 方法成员:包括静态方法和实例方法。

? 属性:按属性指定的get方法和Set方法对字段进行读写。属性本质上是方法。 ? 事件:代表事件本身,同时联系事件和事件处理函数。 ? 索引指示器:允许象使用数组那样访问类中的数据成员。 ? 操作符重载:采用重载操作符的方法定义类中特有的操作。 ? 构造函数和析构函数。

包含有可执行代码的成员被认为是类中的函数成员,这些函数成员有方法、属性、索引指示器、操作符重载、构造函数和析构函数。 1.8.2 类成员访问修饰符

访问修饰符用于指定类成员的可访问性,C#访问修饰符有private、protected、public和internal4种。Private声明私有成员,私有数据成员只能被类内部的函数使用和修改,私有函数成员只能被类内部的函数调用。派生类虽然继承了基类私有成员,但不能直接访问它们,只能通过基类的公有成员访问。protected声明保护成员,保护数据成员只能被类内部和派生类的函数使用和修改,保护函数成员只能被类内部和派生类的函数调用。public声明公有成员,类的公用函数成员可以被类的外部程序所调用,类的公用数据成员可以被类的外部程序直接使用。公有函数实际是一个类和外部通讯的接口,外部函数通过调用公有函数,按照预先设定好的方法修改类的私有成员和保护成员。internal声明内部成员,内部成员只能在同一程序集中的文件中才是可以访问的,一般是同一个应用(Application)或库(Library)。 1.9 类的字段和属性

一般把类或结构中定义的变量和常量叫字段。属性不是字段,本质上是定义修改字段的方法,由于属性和字段的紧密关系,把它们放到一起叙述。 1.9.1 静态字段、实例字段、常量和只读字段 用修饰符static声明的字段为静态字段。不管包含该静态字段的类生成多少个对象或根本无对象,该字段都只有一个实例,静态字段不能被撤销。必须采用如下方法引用静态字段:类名.静态字段名。如果类中定义的字段不使用修饰符static,该字段为实例字段,每创建该


C#入门经典第三版(最新)(4).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:品评员题库

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: