版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第4章面向对象高级《C#程序设计基础入门教程(第3版)》学习目标/Target掌握类的继承,能够通过类的继承实现类功能的扩展,提高代码的复用性。
掌握关键字sealed,能够使用关键字sealed禁止类被继承、禁止方法被重写。掌握多态的实现,能够通过方法的重写实现继承关系中的多态。掌握抽象类的用法,能够定义抽象类,并通过子类继承抽象类。学习目标/Target掌握接口的用法,能够定义接口,并通过子类实现接口。
掌握异常的处理,能够使用try…catch语句和关键字throw处理程序中的异常。了解命名空间与程序集,能够说出命名空间和程序集的概念。章节概述/Summary第3章中介绍了面向对象的基础知识以及类的用法,下面将介绍面向对象的高级知识,包括类的继承、多态、接口、抽象类等。目录/Contents010203类的继承关键字sealed多态目录/Contents040506抽象类和接口异常命名空间与程序集类的继承4.1类的继承是面向对象一个非常重要的特征。在编写一个新类时,可以通过继承一个类来自动拥有该类中的所有可继承的成员,这种方式在程序的开发过程中可以极大地提高代码的复用性,也便于扩展程序的功能。下面将围绕类的继承进行详细讲解。4.1类的继承4.1.1继承的概念掌握类的继承,能够描述继承的概念,并通过案例演示类的继承。学习目标在现实生活中,继承一般是指子女继承父辈的财产。在程序中,继承描述的是事物之间的所属关系,例如,猫和狗都属于动物,它们既继承了动物的一些共同特征,又有自己的一些特征。程序可以认为猫和狗继承自动物。同理,波斯猫和巴厘猫继承自猫,而沙皮狗和斑点狗继承自狗,这些动物之间会形成一个继承体系,如图。4.1.1继承的概念在C#中,类的继承是指在一个现有类的基础上构建一个新的类,构建出来的新类被称作子类,现有的类被称作父类,子类会自动拥有父类所有可继承的属性和方法。子类继承父类时,应在子类的后面添加冒号和需要继承的父类名。4.1.1继承的概念例如,动物和狗的继承关系可以用如下代码表示。示例代码classAnimal{}classDog:Animal{}4.1.1继承的概念表示Dog类继承自Animal类,此时Dog类自动拥有Animal类的属性和方法下面通过一个案例来学习如何实现类的继承。在解决方案Chapter04中创建一个项目名为Program01的控制台应用程序,在Program01项目中实现Dog类对Animal类的继承,具体代码如例。点击查看4.1.1继承的概念运行程序,运行结果如图。4.1.1继承的概念注意classA{}classB{}classC:A,B{}4.1.1继承的概念在类的继承中,需要注意一些问题,具体如下。(1)继承具有单一性,也就是说一个类只能有一个直接的父类。例如,下面的语句是错误的。C类不可以同时继续A类和B类注意classA{}classB:A{}classC:A{} 4.1.1继承的概念多个类可以继承同一个父类。例如下面的语句是正确的。B类和C类都可以继承A类注意classA{}classB:A{}
classC:B{} 4.1.1继承的概念C#允许多层继承,即一个类的父类可以再继承其他类。例如,C类继承自B类,B类又继承自A类,此时C类也可称作A类的子类,下面的语句是正确的。B类继承自A类,B类是A类的子类C类继承自B类,C类是B类的子类4.1.2构造方法的执行过程掌握类的继承,能够描述执行过程,并通过案例演示类之间的继承。学习目标注意子类构造方法(参数列表):base(父类构造方法参数列表){
子类新增属性的初始化语句}子类构造方法调用父类构造方法需要使用关键字base。4.1.2构造方法的执行过程在继承关系中,子类的属性包括从父类继承的属性和自己新增的属性,因此,子类的构造方法除了要初始化子类自己新增的属性之外,还要负责初始化从父类继承的属性,即在子类实例化时,子类的构造方法要负责调用父类的构造方法。4.1.2构造方法的执行过程在定义子类构造方法时,有以下几点需要注意。(1)父类构造方法所需要的参数从子类构造方法的参数列表中获取,即创建子类对象时,要传入包括父类属性和子类新增属性初始化需要的所有参数。(2)子类实例化时,子类构造方法与父类构造方法的调用顺序是,先调用父类构造方法,再调用子类构造方法,如图。4.1.2构造方法的执行过程(3)如果父类没有定义构造方法或仅存在无参构造方法,则在定义子类构造方法时,可以省略对父类构造方法的调用。(4)如果父类定义了有参构造方法,子类必须定义构造方法,提供父类构造方法的参数,完成父类属性的初始化。案例下面通过一个案例来演示类之间的继承。在该案例中,定义一个交通工具类Vehicle,它有一个属性Name,表示交通工具名称;再定义一个小汽车类Car,它继承自Vehicle类,Car类新增了属性Color和Seats,分别表示小汽车颜色和座位数量。创建小汽车类对象,输出小汽车信息,观察子类与父类构造方法的调用过程。4.1.2构造方法的执行过程在解决方案Chapter04中创建一个项目名为Program02的控制台应用程序,在Program02项目中定义Vehicle类,具体代码如例。点击查看4.1.2构造方法的执行过程接下来在Program02项目中定义Car类,它继承自Vehicle类,Car类的具体代码如例。点击查看4.1.2构造方法的执行过程接下来在Program02项目的Program.cs文件中编写逻辑代码,创建小汽车类对象,输出小汽车信息。具体代码如例。点击查看4.1.2构造方法的执行过程运行程序,运行结果如图。4.1.2构造方法的执行过程4.1.3子类方法与父类方法同名掌握类的继承,能够通过案例演示子类方法与父类方法同名的操作。学习目标在继承中,子类会继承父类所有可继承的成员,同时子类也会定义自己的成员。有时,子类新增的成员方法可能会与父类成员方法同名。例如,定义一个动物类Animal,在Animal类中定义一个Shout()方法用于描述动物的叫声;狗类Dog继承了Animal类,同时,Dog类也定义了一个描述狗叫声的方法Shout(),它与父类Animal中的Shout()方法名称相同。此时,子类会隐藏父类中的同名方法,类似于局部变量隐藏全局变量。4.1.3子类方法与父类方法同名在这种情况下,具体调用哪个Shout()方法,取决于对象的引用类型。如果使用Animal类引用,则会调用Animal类的Shout()方法,如果使用Dog类引用,则会调用Dog类的Shout()方法。下面通过一个案例演示上述场景,在解决方案Chapter04中创建一个项目名为Program03的控制台应用程序,具体代码如例。4.1.3子类方法与父类方法同名点击查看运行程序,运行结果如图。4.1.3子类方法与父类方法同名4.1.4重写父类方法掌握类的继承,能够通过案例演示如何重写父类方法的操作。学习目标在Program03\Program.cs中的Animal类定义了Shout()方法,用于描述动物叫声,但动物叫声多种多样,在Animal类中无法进行确切定义,只能由其子类(如狗类、猫类)实现具体的叫声。这样的情况在实际编程中很常见,即父类会提供一些方法,但方法的具体功能由子类实现。4.1.4重写父类方法像父类中的这些无法进行确切定义,需要在子类中实现具体功能的方法,称为虚方法。虚方法使用关键字virtual修饰,它的作用就是让子类对虚方法进行重新定义,即让子类重写父类方法,相当于为子类提供了一个接口,由子类实现具体的功能。4.1.4重写父类方法子类重写父类的虚方法需要使用关键字override,重写的方法的签名要与父类的方法签名一致,即方法名、参数列表、返回值须保持一致。当子类重写了父类的虚方法时,无论对象的引用类型是父类还是子类,只要是子类对象,都会调用子类中的方法。4.1.4重写父类方法下面修改Program03\Program.cs,将Animal类中的Shout()方法声明为虚方法,在Dog类中使用关键字override重写Animal类的Shout()方法。在解决方案Chapter04中创建一个项目名为Program04的控制台应用程序,具体代码如例。点击查看4.1.4重写父类方法运行程序,运行结果如图。4.1.4重写父类方法注意子类重写父类方法时,不能使用比父类中被重写的方法更严格的访问权限,例如父类方法的访问修饰符是关键字public,子类方法的访问修饰符就不能是关键字private。4.1.4重写父类方法关键字sealed4.2关键字sealed可以修饰类也可以修饰方法,被关键字sealed修饰的类被称为密封类,被关键字sealed修饰的方法在子类中不能被重写。下面将对关键字sealed修饰的类与方法进行详细讲解。4.2关键字sealed4.2.1关键字sealed修饰类掌握关键字sealed,能够使用关键字sealed禁止类被继承。学习目标类的继承可以构造功能强大的新类,实现代码重用,提高软件开发效率,是面向对象编程的一个非常优越的特性。但是,有时候在设计类时,并不希望类被继承,例如,在设计框架或库时,开发者可能会创建一些基础类,这些基础类作为框架或库的核心部分,不应该被外部代码继承或修改,以免外部代码通过隐藏、重写等方式破坏其原有的设计或功能。4.2.1关键字sealed修饰类对于这样的类,就可以使用关键字sealed进行修饰。在C#中,使用关键字sealed修饰的类不可以被继承,也就是不能派生子类,这样的类通常被称为密封类。4.2.1关键字sealed修饰类案例演示下面通过一个简单的例子来演示关键字sealed修饰类的用法。假如要开发一个简单的日志记录框架,其中有一个日志记录器类Logger,用于记录详细信息。在记录日志时,需要确保日志记录器的功能完整,同时须防止任何外部类通过继承来修改其行为,即修改日志信息。这时可以使用关键字sealed修饰Logger类。4.2.1关键字sealed修饰类在解决方案Chapter04中创建一个项目名为Program05的控制台应用程序,具体代码如例。点击查看4.2.1关键字sealed修饰类运行程序,程序报错,错误信息如图。4.2.1关键字sealed修饰类4.2.2关键字sealed修饰方法掌握关键字sealed,能够使用关键字sealed禁止方法被重写。学习目标关键字sealed也可以修饰类中的方法,但它只能修饰重写的方法,无法修饰其他类型的方法。当一个类中的方法被关键字sealed修饰后,这个类的子类将不能重写该方法。4.2.2关键字sealed修饰方法下面通过一个案例来实现上述场景,使用关键字sealed修饰Dog类重写的Shout()方法。在解决方案Chapter04中创建一个项目名为Program06的控制台应用程序,具体代码如例。点击查看4.2.2关键字sealed修饰方法运行程序,程序报错,错误信息如图。4.2.2关键字sealed修饰方法由上图可知,Dog.Shout()方法是密封的,SharPei类无法进行重写。注释掉第19~22行代码,再次运行程序,运行结果如图。多态4.34.3.1多态概述掌握多态的实现,能够描述多态的概念。学习目标多态概念多态是面向对象思想中的一个非常重要的概念。在C#中,多态是指不同对象在调用同一个方法时表现出不同行为。例如,要实现一个动物发出叫声的方法,由于每种动物的叫声是不同的,因此可以在方法中接收一个动物类型的参数,当传入猫类对象时就发出猫类的叫声,传入犬类对象时就发出犬类的叫声。在同一个方法中,这种由参数类型不同而导致执行效果不同的现象就是多态。C#中的多态主要有重载和重写两种形式。4.3.1多态概述重载发生在同一个类中,在类中定义方法名相同、参数列表不同的多个方法,在调用时,根据参数列表确定调用的方法,从而实现调用同一个方法时表现出多种不同行为的效果。4.3.1多态概述重写发生在类的继承中,子类重写父类的虚方法,当子类调用方法时,会调用子类重写的方法。如果一个类有多个子类,每个子类都重写了父类的虚方法,则每个子类对象调用相应方法时,都会调用本类重写后的方法,这样就实现了多态。在面向对象编程中,多态通常是指继承中的多态。4.3.1多态概述4.3.2多态的实现掌握多态的实现,能够通过案例演示多态的实现。学习目标案例演示下面通过一个案例演示多态的实现。在本案例中,定义动物类Animal,在Animal类中定义描述动物叫声的方法Shout();然后分别定义犬类Dog和猫类Cat,它们均继承Animal类,在Dog类和Cat类中重写Shout()方法,分别通过Dog类对象和Cat类对象调用Shout()方法实现多态。4.3.2多态的实现在解决方案Chapter04中创建一个项目名为Program07的控制台应用程序,具体代码如例。点击查看4.3.2多态的实现运行程序,运行结果如图。4.3.2多态的实现4.3.3关键字base掌握多态的实现,能够通过案例演示关键字base的具体使用。学习目标当子类重写父类的方法后,子类对象将无法直接调用父类被重写的方法。此时可以使用C#提供的关键字base来访问父类被重写的方法。关键字base专门用于在子类中访问父类的成员,例如调用父类的字段、方法(普通方法)和构造方法等。4.3.3关键字base下面讲解如何使用关键字base访问父类的字段和方法(普通方法)。4.3.3关键字base语法格式base.字段名base.方法名([参数1,参数2,…])使用关键字base访问父类字段和方法的具体语法格式如下。案例演示下面通过一个案例来演示如何调用父类的字段和方法。在本案例中,定义动物类Animal,在Animal类中定义字段name表示动物名称,并定义描述动物叫声的虚方法Shout();然后定义Dog类,它继承自Animal类,在Dog类中也定义字段name表示名称,并重写Animal类中的Shout()方法。在Dog类中访问Animal类中的name字段和Shout()方法。4.3.3关键字base在解决方案Chapter04中创建一个项目名为Program08的控制台应用程序,具体代码如例。点击查看4.3.3关键字base运行程序,运行结果如图。4.3.3关键字base4.3.4里氏转换规则掌握多态的实现,能够通过案例演示里氏转换规则的具体使用。学习目标在现实生活中经常把某事物看作某类型,例如可以将猫和狗看作动物类型。在程序中也经常将子类对象当作父类类型来使用,这时子类与父类之间需要进行类型转换,在转换的过程中需要遵循里氏转换规则。下面通过两种情况来简要介绍里氏转换规则。4.3.4里氏转换规则可以直接将子类对象赋给父类变量。具体代码Animalan1=newCat();Animalan2=newDog();4.3.4里氏转换规则1.子类对象可以直接赋给父类变量将Cat类的对象赋给Animal类的变量将Dog类的对象赋给Animal类的变量上述实例中,Cat类与Dog类都是Animal类的子类,在实例化对象时可以将子类对象赋给父类变量。下面通过一个具体的案例来演示这种情况。在解决方案Chapter04中创建一个项目名为Program09的控制台应用程序,具体代码如例。点击查看1.子类对象可以直接赋给父类变量4.3.4里氏转换规则运行程序,运行结果如图。1.子类对象可以直接赋给父类变量4.3.4里氏转换规则里氏转换的另一条规则是可以将父类变量赋给子类变量,但是将父类对象赋给子类变量时,有以下两点需要注意。4.3.4里氏转换规则2.将父类变量赋给子类变量时需要进行强制类型转换(1)父类变量指向的对象必须是子类类型的对象。(2)在赋值时需要进行强制类型转换。4.3.4里氏转换规则2.将父类变量赋给子类变量时需要进行强制类型转换例如,将Animal类变量an赋给Dog类的变量时,an变量指向的对象必须是Dog类对象,并且在转换时,需要在an变量前面添加小括号,在小括号中指定Dog类型。下面通过修改Program09\Program.cs来演示如何将父类变量赋给子类变量,在解决方案Chapter04中创建一个项目名为Program10的控制台应用程序,具体代码如例。点击查看运行程序,运行结果如图。4.3.4里氏转换规则2.将父类变量赋给子类变量时需要进行强制类型转换在继承关系中,当子类对象指向父类变量时,父类变量也可以通过强制类型转换的方式为子类对象赋值。Animalan=newAnimal();在Program10\Program.cs中,使Animal类变量an指向Animal类对象,即将第23行代码替换为下面的代码。4.3.4里氏转换规则2.将父类变量赋给子类变量时需要进行强制类型转换替换之后,再次运行程序,程序会抛出异常,异常信息如图。4.3.5Object类掌握多态的实现,能够通过案例演示Object类的常用方法。学习目标C#提供了一个Object类,它是所有类的父类,每个类都直接或间接继承Object类。当定义一个类时,如果这个类没有显式的父类,那么该类会默认继承Object类。Object类中定义了一些方法,常用方法如表。方法名称方法说明booleanEquals()判断两个对象是否“相等”TypeGetType()获取当前实例的类型,这对于运行时类型检查很有用StringToString()返回对象的字符串表示形式4.3.5Object类任何一个普通的类都可以调用Object类中的方法,下面通过一个案例进行演示。在解决方案Chapter04中创建一个项目名为Program11的控制台应用程序,具体代码如例。点击查看4.3.5Object类运行程序,运行结果如图。4.3.5Object类程序成功调用了Animal类中的ToString()方法,虽然Animal类中没有定义该方法,但是程序并没有报错。在实际开发中,通常希望对象的ToString()方法不仅返回基本信息,还返回一些特有的信息,这可以通过重写Object类的ToString()方法来实现。下面通过一个案例来演示通过重写Object类的ToString()方法返回一些特有的信息。在解决方案Chapter04中创建一个项目名为Program12的控制台应用程序,具体代码如例。点击查看4.3.5Object类运行程序,运行结果如图。4.3.5Object类可通过在Animal类中重写Object类中的ToString()方法来输出“动物叫”信息。抽象类和接口4.44.4.1抽象类掌握抽象类的用法,能够定义抽象类,并通过子类继承抽象类。学习目标有时候在父类中声明方法并不是出于父类本身的需求,而是考虑到子类的需求。在父类中声明方法,方法的具体实现由子类根据本类的需求定义。例如在前文定义的Animal类中,Shout()方法用于描述动物的叫声,但是不同动物的叫声是不同的,Animal类无法确切地实现Shout()方法,它提供Shout()方法只是考虑到子类的需求,而Shout()方法的具体定义需要由各个子类去完成。4.4.1抽象类具体示例publicabstractvoidShout();针对上面描述的情况,C#允许在定义方法时不写方法体,即只给出方法声明,方法的具体实现由子类完成。不包含方法体的方法为抽象方法,抽象方法必须使用关键字abstract来修饰。4.4.1抽象类定义抽象方法Shout()。具体示例abstractclassAnimal{publicabstractvoidShout(); }当一个类中包含抽象方法,该类也必须使用关键字abstract来修饰,使用关键字abstract修饰的类为抽象类。4.4.1抽象类定义抽象方法Shout()定义抽象类Animal。4.4.1抽象类与普通的类相比,抽象类有以下几个特点。1包含抽象方法的类必须声明为抽象类,但抽象类可以不包含抽象方法。2抽象类不可以被实例化,因为抽象类中可能包含抽象方法,抽象方法是没有方法体的,不可以被调用。3如果抽象类有多个抽象方法,则子类必须将这些抽象方法全部实现。4抽象类中的抽象方法的访问权限必须是public,因为抽象方法需要由子类实现,如果定义为private,子类无法实现该方法。5子类实现父类的抽象方法时,也使用关键字override。案例演示4.4.1抽象类下面通过一个案例演示抽象类的用法。在本案例中,定义抽象类Animal,Animal类包含一个抽象方法Shout()。定义Dog类和Cat类,它们继承Animal类,Dog类实现Shout()方法,Cat类不实现Shout()方法。在Main()方法中分别实例化Dog类和Cat类,观察Cat类是否可以实例化。在解决方案Chapter04中创建一个项目名为Program13的控制台应用程序,具体代码如例。点击查看4.4.1抽象类运行程序,程序报错,错误信息如图。程序报错的原因是第18~20行代码定义的Cat类没有实现父类Animal的抽象方法Shout()。这就表明,子类在继承抽象类时,必须实现抽象类的抽象方法。4.4.1抽象类实现代码publicoverridevoidShout(){Console.WriteLine("小猫叫声:喵喵……");}修改Cat类的定义,实现Shout()方法。4.4.1抽象类实现Animal类的Shout()方法修改之后,再次运行程序,运行结果如图。4.4.1抽象类子类Cat通过关键字override实现了父类Animal中的抽象方法后,可以进行正常的实例化,程序可以正常运行。4.4.2接口掌握接口的用法,能够定义接口,并通过子类实现接口。学习目标如果一个抽象类中的所有方法都是抽象方法,则可以将这个类定义为接口。接口是一种特殊的类,它的成员方法只能是抽象方法,不能包含非抽象方法。除了抽象方法,接口中还可以定义变量、属性、事件,但不能定义字段。4.4.2接口示例代码interfaceAnimal{voidBreathe();
voidRun();}虽然接口是一种抽象类,但它是一种特殊的抽象类,不能使用关键字abstract定义接口,而应使用关键字interface定义。定义抽象方法4.4.2接口定义抽象方法接口也不能实例化,它只是提供了一个公有接口,让子类去实现,以便更有效地发挥多态性。子类在实现接口中的抽象方法时,不能使用关键字override。4.4.2接口下面通过一个案例来演示接口的应用。在本案例中,定义一个接口Animal。在Animal接口中声明Breathe()和Run()抽象方法,分别表示动物的呼吸和奔跑,然后定义Dog类实现接口。在解决方案Chapter04中创建一个项目名为Program14的控制台应用程序,具体代码如例。点击查看4.4.2接口运行程序,运行结果如图。程序在控制台中输出“狗在呼吸”和“狗在奔跑”的信息,表明Dog类成功实现了接口Animal类中的抽象方法。4.4.2接口案例演示在C#中,类之间的继承是单继承,但对接口来说,一个类可以实现多个接口,多个接口之间使用逗号隔开。这也是C#引入接口的目的,即克服类的单继承带来的限制。下面通过一个案例演示一个类如何实现多个接口。假设要开发一个员工管理系统,一个员工既可以是开发者也可以是管理者,开发者的开发方向和管理者的管理职能都不确定,可以将开发者和管理者定义为接口,并提供开发和管理的抽象方法,然后定义员工类实现开发者和管理者接口。4.4.2接口在解决方案Chapter04中创建一个项目名为Program15的控制台应用程序,具体代码如例。点击查看4.4.2接口运行程序,运行结果如图。4.4.2接口下面通过修改Program14\Program.cs演示接口之间的继承。在Program14\Program.cs中新增一个接口LandAnimal,让LandAnimal接口继承接口Animal,并且在LandAnimal接口中新增一个抽象方法LiveOnLand(),表示动物的生存环境。定义Dog类继承LandAnimal接口,这样Dog类须同时实现Animal接口中的Breathe()方法、Run()方法,以及LandAnimal接口中的LiveOnLand()方法。在解决方案Chapter04中创建一个项目名为Program16的控制台应用程序,具体代码如例。点击查看4.4.2接口运行程序,运行结果如图。4.4.2接口异常4.54.5.1什么是异常掌握异常的处理,能够通过案例演示什么是异常。学习目标在编写程序的过程中,难免会出现一些错误,例如除零错误、指针访问受保护空间、数组越界、访问的文件不存在等,这些错误会导致程序运行失败。这些导致程序运行失败的错误,通常称为异常。4.5.1什么是异常下面通过一个案例来演示什么是异常。在本案例中实现两个整数相除,让除数为0。在解决方案Chapter04中创建一个项目名为Program17的控制台应用程序,具体代码如例。点击查看4.5.1什么是异常运行程序,程序出现异常,异常信息如图。4.5.1什么是异常Exception类的继承体系如图。4.5.1什么是异常Exception类有4个常用子类,下面分别进行介绍。1SystemException类:ApplicationException类:系统相关异常的基类,它有许多子类,分别表示各种与系统相关的异常类型。2应用程序特定异常的基类,它允许开发者定义自己的异常层次结构,为应用程序提供一组特定的异常类型。3AggregateException类:Runtime.InteropServices.COMException:一个具体类,用于包装多个异常,通常在任务并行库中使用。4一个具体类,用于处理与COM对象交互时发生的错误,当.NET应用程序试图访问或操作COM组件并且遇到了错误时,就会抛出Runtime.InteropServices.COMException异常。4.5.1什么是异常为了更好地展示异常信息,每个异常对象中都包含一些只读属性,这些属性用于描述异常信息,通过这些属性可以更准确地找到出现异常的原因。异常对象的常用属性如表。4.5.1什么是异常属性类型描述Messagestring此属性含有解释异常原因的消息StackTracestring此属性含有描述异常发生的位置信息InnerExceptionException如果当前异常是由另一个异常引起的,此属性包含前一个异常的引用HelpLinkstring此属性为异常原因信息提供URN(UniformResourceName,统一资源名称)或者URL(UniformResourceLocator,统一资源定位符)Sourcestring此属性含有异常起源所在的程序集的名称4.5.2try…catch和finally掌握异常的处理,能够使用try…catch语句处理程序中的异常。学习目标语法格式try{//代码块}catch(ExceptionTypee){
//对异常的处理}为了确保程序的高容错性,在编写程序的过程中,需要对异常进行处理,防止系统崩溃。大多数常见的编程语言都提供了异常处理机制,C#也不例外。C#提供了一种对异常进行处理的方式——异常捕获。异常捕获通常使用try…catch语句。要捕获的异常类型,可以是Exception类及其子类4.5.2try…catch和finally语法格式catch{//对异常的处理}C#中的catch代码块有多种形式,不同形式的代码块用于处理不同级别的异常,具体如下。(1)一般的catch代码块。catch后面没有任何内容,可以匹配try代码块中任意类型的异常。4.5.2try…catch和finally语法格式catch(Exceptiontype){//对异常的处理}(2)特定catch代码块。catch后面带有异常类型,它可以匹配该类型的所有异常。4.5.2try…catch和finally语法格式catch(ExceptiontypeInstID){//对异常的处理}(3)特定对象的catch代码块。catch后面不仅带有异常类型,还带有异常对象,通过异常对象可以获取异常信息。4.5.2try…catch和finally下面使用try...catch语句对Program17\Program.cs中出现的异常进行捕获,在解决方案Chapter04中创建一个项目名为Program18的控制台应用程序,具体代码如例。点击查看4.5.2try…catch和finally运行程序,运行结果如图。4.5.2try…catch和finally程序输出了异常相关信息,表明当try代码块中的代码抛出异常之后,异常被第一个catch代码块捕获,并执行该代码块中的处理语句。在程序中,如果希望某些语句无论程序是否发生异常都要被执行,可以在try…catch语句后加一个finally代码块。下面对Program18\Program.cs进行修改,以演示finally代码块的用法。在解决方案Chapter04中创建一个项目名为Program19的控制台应用程序,具体代码如例。点击查看4.5.2try…catch和finally运行程序,运行结果如图。4.5.2try…catch和finally4.5.3关键字throw掌握异常的处理,能够使用关键字throw处理程序中的异常。学习目标当程序中出现异常时,不仅可以通过try…catch语句捕获异常,而且可以使用关键字throw抛出异常对象。抛出的异常对象可以被上层的try…catch语句捕获处理,也可以不做处理,继续将异常向上抛出,直到系统捕获异常,终止程序运行。4.5.3关键字throw假如有一个算术运算类Arithmetic,在Arithmetic类中定义一个整数除法方法Division(),Division()方法可能会发生除零异常。在定义Division()方法时,不处理异常,而是将异常抛出,由调用者进行处理。下面通过案例实现上述场景,在解决方案Chapter04中创建一个项目名为Program20的控制台应用程序,在Program20项目中添加Arithmetic类,具体代码如例。点击查看4.5.3关键字throw接下来在Program20项目的Program.cs文件中编写逻辑代码,调用Division()方法,并对Division()方法可能抛出的异常进行捕获处理,具体代码如例。点击查看4.5.3关键字throw运行程序,运行结果如图。4.5.3关键字throw修改Program20\Program.cs,在调用Division()方法时,不对Division()方法抛出的异常进行捕获,而是继续向上抛出,抛给Main()方法的调用者,即抛给系统,系统会捕获该异常,终止程序运行。修改后的代码如例。点击查看4.5.3关键字throw命名空间与程序集4.6在C#程序中,如果需要引用不同程序中的类,就需要引入该类的命名空间。命名空间是程序定义的一个逻辑范围,可以避免类名的冲突问题。如果想要引用自定义的多个类,可以将要引用的类存放在一个程序集中,然后将该程序集引入项目中。本节将对命名空间和程序集进行详细讲解。4.6命名空间与程序集4.6.1什么是异常了解命名空间与程序集,能够说出命名空间的概念。学习目标示例代码namespaceExample{ClassAnimal{voidShout(){ Console.WriteLine("动物的叫声"); }}}在实际开发过程中,除了自己编写的程序中的类外,还可能需要引用其他程序中的类,这时可能会碰到类名相同的情况。为此,C#中引入了命名空间这个概念。可以将命名空间理解为程序定义的一个逻辑范围,使用命名空间可以有效避免类名冲突的问题。4.6.1什么是异常定义命名空间的关键字命名空间的名称示例代码staticvoidMain(string[]args){Example.Animalanimal=newExample.Animal();Console.ReadKey();}当程序需要调用其他命名空间的类时,可以在程序中使用完整的限定名,在实例化对象、调用方法、属性时都要使用“命名空间名.成员”的方式来引用。4.6.1什么是异常示例代码usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingExample;
namespaceTest{classTest{staticvoidMain(string[]args){Animal=newAnimal();Console.ReadKey();}}}下面通过一段代码来演示如何使用关键字using引入E
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年大学生军事知识竞赛多选题库及答案(共70题)
- 2026届高考语文写作指导:健全人格主题作文训练
- 2025-2026学年云南省昆明市石林县八年级(上)期末历史试卷(含答案)
- 互联网内容审核与监管操作手册
- 2024人教版八年级生物下册第六单元第一章《生物的生殖》每节课分层作业汇编(含两套作业)
- 企业档案管理标准与流程
- 移动互联网应用开发与运营指南(标准版)
- 2-Deoxy-D-glucose-6-phosphate-sodium-生命科学试剂-MCE
- 2026二年级数学上册 简单的时间计算
- 2025 六年级地理下册巴西的旅游景点课件
- 医学影像学(第8版)第四章呼吸系统
- 四川省2025年高职单招职业技能综合测试(中职类)汽车类试卷(含答案解析)
- 肺癌护理新进展与趋势
- 2026年党建工作要点
- 无法参加庭审申请书模板
- 2025中华护理学会团体标准-成人患者医用粘胶相关性皮肤损伤的预防及护理
- 全国农产品质量安全检测技能竞赛理论知识考试试题题库2025年附答案
- 丹纳赫传奇+从100万到亿美金的奇迹+22%年化复利密码
- 2026年长沙商贸旅游职业技术学院单招职业技能测试题库完美版
- 广东省数字政府政务云服务(2025年)项目采购需求
- 2025年港澳联考真题卷子及答案
评论
0/150
提交评论