知识点讲解
 
       .NET平台技术及其结构
知识路径: > 电子商务系统程序设计基础 > 电子商务平台开发基础 > NET平台技术及其结构 > 
被考次数:13次
被考频率: 高频率
总体答错率: 42%
知识难度系数:
考试要求: 熟悉     
相关知识点:25个
               .NET平台技术及其结构
               .NET是微软的新一代技术平台,根据微软的定义:.NET=新平台+标准协议+统一开发工具。从技术的角度,一个.NET应用是一个运行于.NET Framework之上的应用程序。更精确地说,一个.NET应用是一个使用.NET Framework类库来编写,并运行于公共语言运行时(Common Language Runtime)之上的应用程序。
               .NET不仅可以管理代码的执行,而且能为代码提供服务,扮演双重角色。
               其中.NET提供的服务包括:①.NET Framework,是.NET提供的一种新的运行环境;②ASP.NET,是为创建HTML页面而提供的一种新的编程模型;③Windows窗体,是为编写各种程序提供的新方法;④XML Web,为Internet服务器提供新的方法;⑤ADO.NET,支持数据库访问。
               .NET Framework目标是成为新一代基于Internet的分布式计算应用开发平台。其框架层次结构如下图所示。
               
               .NET框架基本层次
               .NET框架支持多语言开发,便于建立Web应用程序及Web服务,加强Internet上各应用程序之间通过Web服务的沟通。
               .NET框架主要包括三个主要组成部分:公共语言运行时(Common Language Runtime,CLR)、服务框架(Services Framework)以及应用模版。
               其中,CLR管理了.NET中的代码,管理内存与线程;服务框架为开发人员提供了一套基于标准语言库的基类库,除了基类之外,包括接口、值类型、枚举和方法,可完成许多不同的任务,以简化编程工作;应用模版包括传统的Windows应用程序模板(Windows Forms)和基于ASP.NET的面向Web的网络应用程序模板(Web Forms和Web Services)。
               面向对象编程概述
                      面向对象程序设计思想
                      面向对象编程(Object-Oriented Programming,OOP)技术是当今占主导地位的程序设计思想和技术,也是开发电子商务平台中使用的重要技术。面向对象程序设计首先针对问题要处理的数据特征找出相应的数据结构,然后设计解决问题的各种算法,并将数据结构和算法看做一个有机的整体,即“类”。由“类”可以实例化出一个或者多个对象,每个对象各尽其职,分别执行一组相关任务。OOP对问题的分析和解决基于两个原则:抽象和分类。
                      面向对象程序是由许多对象组成,对象是程序的实体,这个实体包含了对该对象属性的描述(数据结构)和对该对象进行的操作(算法)。
                      面向对象三大特征
                      (1)封装。封装是面向对象编程的特征之一,也是类和对象的主要特征。封装将数据以及加在这些数据上的操作组织在一起,成为有独立意义的构件—类。外部无法直接访问这些封装了的数据,从而保证了这些数据的正确性。
                      (2)继承。面向对象编程语言的重要特点就是“继承”。从编程角度来说,如果类A继承类B,类A称为子类,类B称为父类,子类继承父类成为一个新类,直接获得父类的方法和属性,并在无需重新编写原来的类的情况下对这些功能进行扩展,是软件重用的重要方式。因此,一个子类完整的内容往往包括:从父类继承而来的成员;自身添加的成员;父类成员不符合要求而重写的成员。
                      (3)多态。多态是指面向对象程序运行时,相同的信息可能会送给多个不同的类型的对象,而系统可依据对象所属类型,引发对应类型的方法,而有不同的行为。简单来说,所谓多态意指相同的信息给予不同的对象会引发不同的行为。
               C#语言编程基础
                      数据类型和变量
                      C#语言将数据分为不同的类型,它们分别表示不同范围、不同精度、不同用途的数据。C#语言数据类型体系如下图所示。
                      
                      C#的数据类型
                      C#语言中具有数值类型的变量存储的是数值数据,而引用类型的变量则只存储数据的存储单元地址。
                      (1)变量和常量。
                      常量(Constant)是指在程序的运行过程中值不能改变的量。
                      定义常量的一般格式为:
                      
                      变量是计算机内存中被命名的数据存储单元,其中存储的值是可以改变的。在程序中通过变量名来引用其中存储的信息。
                      在C#中,变量名必须遵守以下规则:变量名不能与C#中的库函数名称相同;首字符必须是字母、下画线或者“@”;区分大小写;变量名不能与C#关键字名相同。
                      C#规定在程序中所有用到的变量都必须在程序中定义,即遵守“先定义后使用”或“先声明后使用”的原则。
                      定义变量的一般格式:
                      
                      定义好的变量不能直接被用来使用和计算,需要先对其进行初始化才能使用。也就是说变量需要先赋值再使用。
                      变量初始化格式:
                      
                      (2)整数类型。
                      整数类型是指那些没有小数部分的数字,包括整数常量和整数变量。
                      整数常量即整数类型的常数,一般包括以下两种形式。
                      .十进制数:348、-56、0等。
                      .十六进制数:这类数据以“0x”(其中0是数字0)开头,如:0x61,表示十六进制的61,相当于十进制数据97。
                      变量间进行赋值运算要注意其存储范围,一旦超出存储范围,否则会发生“溢出”现象,使程序报错。
                      (3)字符类型。
                      在C#中,无论是字符类型常量还是字符类型变量,都是使用Unicode编码中的字符。
                      可使用关键字char来定义字符类型数据。char类型的变量占用2个字节的内存。
                      .字符常量
                      字符常量是用单引号括起来的一个字符。如‘s’、‘x’、‘Y’等都是字符常量。
                      除了以上形式的字符常量外,还允许使用一种特殊形式的字符常量,就是以一个“\”开头的“转义字符”。例如,字符‘\n’代表换行,‘\t’代表跳格等。
                      .字符变量的赋值方法
                      给字符变量赋值有以下几种方法。
                      直接赋值:
                      
                      用十六进制数转化:
                      
                      利用强制转换:
                      
                      (4)浮点数类型。
                      .float型(单精度类型)
                      float数据类型使用4个字节的内存来存储数字,float型绝对值的最小值是1.5×10-45这表示在小于1.5×10-45和大于-1.5×10-45之间的数据是无法表示的。float型精度为7位有效数字。
                      .double型(双精度类型)
                      double类型的变量占用8个字节的内存,精度为15~16位有效数字。
                      (5)小数类型。
                      C#提供了decimal类型。这是一个占用16个字节(128位)的数据类型,适用于金融货币计算,精度为28~29位有效数字。与其他数据类型不同的是,decimal没有无符号形式。
                      (6)布尔型。
                      布尔类型是一种用来表示“真”和“假”的逻辑数据类型。布尔类型占用1个字节的内存。布尔类型变量只有两种取值:true(代表“真”),false(代表“假”)。
                      (7)引用类型。
                      C#提供了两种主要的信息存储方式:按值(by value)和按引用(by reference)。
                      当变量按值存储信息时,变量将包含实际的信息。当变量按引用存储信息时,存储的不是信息本身,而是信息在内存中的存储位置。
                      C#语言中属于引用类型的数据类型有:对象类型(object)、类类型(class)、字符串类型(string)、接口类型(interface)、数组类型(array)、代理类型(delegate)。
                      (8)字符串类型。
                      字符串类型的变量是由关键字string来定义的,它是类System.String的别名。
                      字符串类型也有常量和变量之分。字符串变量由关键字string来定义,而字符串常量用“”括起来表示,例如“jack”。
                      运算符和表达式
                      (1)C#运算符概述。
                      运算符是用来指定在表达式中执行哪些操作的符号。
                      C#语言包括以下3种类型的运算符:单目运算符(带有1个操作数);双目运算符(带有2个操作数);三目运算符(带有3个操作数),目前只有条件运算符“?:”是三目运算符。
                      C#中的运算符如下表所示。
                      
                      C#运算符
                      当一个表达式含有多个运算符时,运算符的优先级就控制了单个运算符的求值顺序。给出了运算符从高到低的优先级如下表所示。
                      
                      运算符优先级
                      (2)赋值运算符。
                      赋值表达式的格式:变量=表达式;
                      C#提供了复合赋值运算符(如上表所示),例如:x+=10;等价于赋值语句:x=x+10;
                      (3)算术运算符及其表达式。
                      算数运算符包括基本算术运算符“+、-、*、/、%”和自加自减运算符“++、--”等。
                      .加法和减法运算符
                      参与运算的操作数都是数字时,加法运算同一般的数学运算是一致的。参与运算的操作数都是字符串,相加的结果是两字符串连接在一起。参与运算的操作数分别是数字和字符串,得到的结果是将数字转变为字符串,然后将两个字符串连接在一起。
                      .自增自减运算符
                      自增运算符++将操作数的值自动加1,自减运算符--将操作数的值自动减1。含有自增和自减运算符表达式的两种应用形式:
                      y=++(或--)x:先将x值做++(或--)运算,然后再赋值给y;
                      y=x++(或--):先将x值赋给y,然后再将x值做++(或--)运算。
                      .乘法和除法运算符
                      一般来说,所有的数值类型都可以参与乘、除法运算,但在进行乘法运算时需考虑其运算结果是否超越了数据类型所能够容纳的最大值。如果超出则会发生溢出现象,程序无法通过编译。
                      .取余运算符
                      取余运算将遵循以下规则:
                      第一,对于除数和被除数都是正数(包括正整数和正浮点数),将除数和被除数做减法,直到得到的结果小于被除数,这时的结果就是取余运算的结果。
                      第二,对于负数或负浮点数的取余运算,如果除数和被除数互相异号,即除数和被除数一个是正数一个是负数,则将除数和被除数做加法,直到得到的结果的绝对值小于被除数的绝对值为止,这时得到的结果就是取余运算的结果;如果除数和被除数都是负数,则按照两者都是正数时的运算方法求余数,判断终止取余运算同样也使用绝对值。
                      (4)关系运算符。
                      比较运算符“<、>、>=、<=”是二目运算符,作用是比较两操作数的大小。其操作数可以是所有的数值类型变量,比较的结果是“true”或“false”。相等运算符“==”和不等运算符“!=”是用来判断操作数是否相等或不等。等式运算的操作数可以是数值类型变量,也可以是引用类型变量。
                      (5)逻辑运算符。
                      “&&”运算符表示逻辑“与”,它被用于判断是否同时满足两个或两个以上的条件的时候。其操作数可以是布尔类型变量或关系表达式。在一个“与”操作中,如果第一个操作数是假,则不管第二个操作数是什么值,结果都是假。
                      “||”运算符表示逻辑“或”,它用来判断是否满足两个或两个以上的条件之一,其操作数可以是布尔类型变量或关系表达式。在一个“||”操作中,如果第一个操作数是真,则不管第二个操作数是什么值,结果都是真。
                      “!”运算符是一个一元运算符,表示逻辑非。同样,其操作数可以是布尔类型变量或者关系表达式。
                      (6)条件运算符。
                      条件运算符“?:”是唯一的一个三目运算符,它需要3个操作数。
                      条件运算表达式的一般格式是:关系表达式?表达式1:表达式2
                      功能:如果关系表达式的值是true,则条件运算表达式得到的值为表达式1的值,否则为表达式2的值。
                      程序控制语句
                      程序的执行过程控制是算法思路实现的逻辑路径,是程序设计的核心。根据结构化程序设计思想,程序的流程主要由3种基本结构组合而成:顺序结构、选择结构和循环结构,它们是现代程序设计的基础。
                      (1)选择结构。
                      在C#语言中,提供了两种选择结构程序设计的语句结构:if-else语句和switch语句。它们的作用就是根据某个条件是否成立,控制程序的执行流程。
                      .if语句
                      if语句是最常用的选择语句,它的功能是根据所给定的条件(常由关系、布尔表达式表示)是否满足,决定是否执行后面的操作。
                      
                      功能:如果表达式的值为真(即条件成立),则执行if语句所控制的语句块;如果表达式的值为假(即条件不成立),则直接执行语句块后面的语句。
                      if语句结构流程控制如下图所示。
                      
                      if语句结构
                      .if-else语句
                      
                      功能:如果表达式成立,则执行语句组1,然后执行语句组2的下一条语句。如果表达式不成立,则跳过语句组1,执行语句组2,然后执行语句组2的下一条语句。
                      if-else语句结构流程控制如下图所示。
                      
                      if-else语句结构
                      .else-if多分支语句
                      
                      功能:当表达式1为真时,执行语句组1,然后跳过整个结构执行下一个语句;当表达式1为假时,跳过语句组1去判断表达式2。若表达式2为真时,执行语句组2,然后跳过整个结构去执行下一个语句;若表达式2为假时,则跳过语句组2去判断表达式3。以此类推,当表达式1、表达式2……表达式n-1全为假时,则执行语句组n,再转而执行下一条语句。
                      else-if多分支语句流程控制如下图所示。
                      
                      else-if多分支语句结构
                      .switch语句
                      switch语句的一般形式:
                      
                      其中:
                      “表达式”也可以是变量,但必须是能计算出具体的“常量表达式”表示的量。
                      “常量表达式”是“表达式”的计算结果,可以是整型数值、字符或字符串。switch语句的执行过程:首先计算switch后面的表达式的值。其次,将上述计算出的表达式的值依次与每一个case语句的常量表达式的值比较。如果没有找到匹配的值,则进入default,执行语句组n+1;如果没有default,则执行switch语句后的第一条语句;如果找到匹配的值,则执行相应的case语句组语句,执行完该case语句组后,整个switch语句也就执行完毕。因此,最多只执行其中的一个case语句组,然后将执行switch语句后的第一条语句。
                      (2)循环结构。
                      在程序中除了使用语句改变流程外,有时还需要重复执行某个代码段多次。为了实现重复执行代码的功能,C#提供了while、do-while、for和foreach-in 4种循环语句。
                      .while循环
                      while语句可用来实现当条件为“真”时,不断重复执行某个代码块的功能,其语句格式为:
                      
                      while语句其执行过程如下:
                      ①计算while语句的条件表达式的值。
                      ②如表达式的值为真,则执行循环体“语句块”,并改变控制循环变量的值。
                      ③返回while语句的开始处,重复执行步骤a和b,直到表达式的值为假,跳出循环并执行下一条语句。
                      while语句结构流程控制如下图所示。
                      
                      while语句结构
                      .do-while循环
                      do-while语句的特点是先执行循环,然后判断循环条件是否成立。其语句格式为:
                      
                      while语句其执行过程如下:
                      ①当程序执行到do语句后,就开始执行循环体语句块,并改变循环变量的值。
                      ②执行完循环体语句后,再对while语句括号内的条件表达式进行判断。若表达式条件成立(为真),转向步骤a继续执行循环体语句;否则退出循环,执行下一条语句。
                      do-while语句结构流程控制如下图所示。
                      
                      do-while语句结构
                      while和do-while语句的区别:
                      do-while语句不论条件表达式的值是什么,其循环体语句都至少要执行一次,而while语句只有当条件表达式的值为真时,才执行循环体语句,如果条件表达式一开始就不成立,则循环体语句一次都不必执行。总之,do-while循环是先执行循环体,后判断条件表达式是否成立;而while语句是先判断条件表达式,再决定是否执行循环体。
                      .for循环
                      for语句是构成循环最灵活简便的一种方法。for语句的一般格式为:
                      
                      for语句其执行过程如下:
                      ①先计算表达式1的值。
                      ②求解表达式2的值,若表达式2条件成立,则执行for语句的循环体语句组,然后执行下面的第c步;若条件不成立,则转到第e步。
                      ③求解表达式3。
                      ④转回第b步执行。
                      ⑤循环结束,执行for语句下面的一个语句。
                      for语句结构流程控制如下图所示。
                      
                      for语句结构
                      .break和continue语句
                      break语句通常用在switch语句和各种循环语句中。
                      break语句的使用格式为:break;
                      在switch语句中,break语句的作用是使程序流程跳出switch语句结构。在各种循环语句中,break语句的作用是使程序中止整个循环。注意,如是多重循环,break不是使程序跳出所有循环,而只是使程序跳出break本身所在的循环。
                      continue语句用于各种循环语句中,continue语句的使用格式为:continue;
                      continue语句的作用是跳过循环体中剩余的语句而强行执行下一次循环。
                      continue语句与break语句的区别:continue语句用于结束本次循环,即跳过循环体中continue语句下面尚未执行的语句,再判断表达式的条件,以决定是否执行该循环体的下一次循环。而break语句则是终止当前整个循环,不再进行条件表达式的判断。在while和do-while语句中,continue语句用于把程序流程转至执行条件测试部分,而在for循环中,则转至表达式3处,以改变循环变量的值。
                      数组
                      数组是一种一对多的数据类型,即它是可以存储多个同类型值(或元素)的单个数据类型,其中所有的值(或元素)可以通过数组的下标来访问,并且这些元素在内存中占据着一块连续的存储空间,这里介绍一维数组和二维数组。
                      (1)一维数组。
                      同变量一样,数组也必须“先定义,后使用”。定义一维数组的格式如下:
                      
                      方括号“[]”在这里表示是定义一个数组,而不是普通的一个变量或对象。
                      例如:int[]arry;定义了一个名为arry的整型数组,意味着该数组可用来存放多个整数,但此时并没有为存储变量分配空间。在C#语言中,定义数组后必须对其初始化(为数组分配内存空间)才能使用。初始化数组有两种方法:静态初始化和动态初始化。
                      ①静态初始化。如果数组中包含的元素不多,且初始元素值是已知的,则可以采用静态初始化方法。静态初始化数组时,必须与数组定义结合在一起,否则会报错。
                      例如:
                      
                      ②动态初始化。动态初始化需用new关键字将数组实例化为一个对象,再为该数组对象分配内存空间,并为数组元素赋初值。动态初始化数组的格式为:
                      例如:
                      
                      或写为:
                      
                      当定义完一个数组,并对其初始化后,就可以引用数组中的元素了。一维数组的引用方式是:
                      
                      数组的下标是元素的索引值,它代表了要被访问的数组元素在内存中的相对位置,就是从数组的第1个元素到某个数组元素的偏移量。在C#中数组元素的索引是从0而不是1开始的,如数组arry的第1个元素是arry[0],第2个元素是arry[1],以此类推。
                      (2)二维数组。
                      在C#语言中,多维数组可看作是数组的数组,即高维数组中的每一个元素本身也是一个低维数组,二维数组的定义格式:
                      
                      二维数组也包括两种初始化方法,即:静态初始化和动态初始化,并且其初始化形式也非常相似。
                      例如,以下定义一个3行2列的整型二维数组并对其静态初始化:
                      
                      二维数组经过初始化后,其元素在内存中将按一定的顺序排列存储。二维数组的存储序列为按矩阵的“行”顺序存储,例如上例中a数组的存储顺序为:
                      
                      .动态初始化
                      动态初始化例如:
                      
                      在动态初始化二维数组时,也可直接为其赋予不同的初始值。例如:
                      
                      与一维数组类似,二维数组也是通过数组名和下标值来访问数组元素的。唯一与一维数组不同的是,二维数组需由两个下标来标识一个数组元素,二维数组的引用形式为:
                      
                      例如:a[2,3]表示是a数组的第3行、第4个元素。
                      类
                      类是C#语言实现面向对象程序设计的基础,它是C#封装的基本单元,类把对象、属性和方法这些类成员封装在一起构成一个有机整体,即数据结构。当类的成员定义为保护或私有(protected或private)时,外部不能访问;定义为公有(public)时,则任何用户均可访问。
                      (1)类的结构及创建对象。
                      在C#中用关键字class来定义类,其基本格式为:
                      
                      类是由数据成员和函数成员组成,它们分别是面向对象理论中类的属性和方法。类的数据成员包含类的常量成员和类的变量成员,它们可以是前面介绍的任何数据类型的变量,甚至可以是其他类。
                      类成员的访问权限用来限制外界对某一个类成员的访问。类成员的访问权限有以下几种:
                      .public:允许外界访问。
                      .private:不允许外界访问,也不允许派生类访问,只能在定义该成员的类中调用。
                      .protected:只允许在定义该成员的类或其派生类的内部被调用。
                      .internal:使用该声明符的类型或成员只允许在同一程序集内访问。
                      创建类对象的过程就是实例化类,其语句格式如下:
                      
                      其中对象名就是要创建的对象名称。
                      例如:
                      
                      定义(构造)一个Point类的对象StringPoint,并为该对象分配存储空间。
                      (2)类的数据成员。
                      类数据成员在C#中用来描述一个类的特征,即面向对象理论中类的属性。C#中有两类数据成员,一类是常量成员,另一类是变量成员。
                      在某个类中定义的常量就是这个类的常量成员,这个类的所有其他成员都可以使用这个常量来代表某个值。
                      在类中定义变量成员的格式:
                      
                      在应用中,一般将变量成员分为两类,静态变量成员(带static修饰符定义的变量)和非静态变量成员(又称为实例变量成员,即定义时不带static修饰的)。
                      (3)类的方法成员及使用。
                      方法是指类中用于对数据进行某种处理操作的算法,它就是实现某种功能的程序代码模块,在C/C++中称作函数,在面向对象编程技术中,将函数称为方法。在方法中,代码必须是结构化的。方法是访问、使用私有成员变量的途径。在C#中,方法与它操作的对象封装在一起构成类,所以方法是类的成员。在一个类中定义成员方法的格式为:
                      
                      (4)方法重载。
                      在程序中调用方法都是通过方法名来实现的,如果对于具有相同功能而参数不同的方法取不同的方法名,不但会降低程序员编写程序的效率,也降低了程序的可读性。
                      例如,以下是一些执行打印不同数据类型数据的打印方法,各种方法取不同的方法名。
                      
                      以上3个方法都是执行打印功能,但却使用了3个不同的方法名,给编写、阅读和调用程序都带来了不便,如能使用同一个方法名,则会方便得多。在C#语言中,可以在同一个类的内部定义多个名字相同而参数表不同的方法,这就是所谓的方法重载。换个说法,实现用同名的方法对不同类型的数据做不同的运算,就称为方法重载。
                      使用方法重载技术后,上述3个打印的方法可以如下定义:
                      
                      对于重载的方法,C#是通过方法中的参数匹配来决定调用哪个方法。所以调用方法时的参数类型、属性和个数一定要与类中将要被调用的方法的参数列表对应,这样才能实现正确调用。
                      继承
                      “继承”机制使我们能用一种简单的方式来描述事物。例如可以这样描述菱形:菱形是一种一组邻边相等的平行四边形。这里表明:菱形是由平行四边形类派生出来的,它是平行四边形类中的一种,即菱形继承了平行四边形的特性(两组对边分别平行的四边形),但它又同时具有自己的特征(有一组邻边相等)。“一组邻边相等”是菱形区别于平行四边形类中其他子类的属性。所以当我们已描述了平行四边的特征,再描述菱形时,只要举出菱形的个性化特征,就完全可以让人们理解什么叫菱形了。由此我们可以说,菱形继承了平行四边形的特征,或者说平行四边形派生了菱形。
                      从下图的继承关系上看,每个子类有且只有一个父类,所有子类都是其父类的派生类,它们都分别是父类的一种特例,父类和子类之间存在着一种“继承”关系。不同图形之间的继承层级结构示意图如下图所示。
                      
                      继承的层级结构示意图
                      我们在面向对象程序设计中就利用这种“继承”和“派生”关系来组织和描述及表达事物,常使用以下基本术语:
                      .基类:指被继承的类,也就是父类。通过继承,用户可以重用父类的代码,而只需专注编写子类的新代码。
                      .派生类:指通过继承基类而创建的新类,也就是子类。
                      .单继承:派生类是由一个(且只能是一个)基类创建的。C#只支持单继承。
                      .多继承:派生类是由两个或以上的基类创建的。C#不支持多继承,而是通过“接口”来实现的。
                      从基类继承或派生出一个新子类的语句格式为:
                      
                      现在我们构造一个学生类Student作为基类,然后增加研究生类,由于研究生除了有其本身的特点外,还具有学生的所有属性,所以我们利用继承机制在研究生类中重用学生类的成员,同时在研究生类中再补充新的成员。
                      多态
                      在C#中,多态性是通过“虚方法重载”来实现在程序中调用相应对象所属类中的方法,而不是调用基类的方法。
                      C#语言可以在派生类中实现对基类的某个方法、属性或索引等类成员重新定义,而这些成员名和相应的参数都不变,这种特性叫虚成员重载。所以虚方法重载就是指将基类的某个方法在其派生类中重新定义,也叫重写方法,而方法名和方法的参数都不改变。实现虚成员重载的C#语言编程构架是:
                      先在基类中用virtual修饰符定义虚成员。虚成员可以是类的方法、属性和索引等,不能是域或私有变量成员。定义虚成员与定义普通成员的格式是一样的,只是另加修饰符virtual即可。
                      定义虚方法的格式为:
                      
                      在派生类中用override修饰符重新定义与基类同名的覆盖成员,并根据需要重新定义基类中虚成员的代码(方法重写),以满足不同类的对象的使用需求,这就是重载虚成员多态的实现。
                      定义重载虚方法(覆盖方法)的格式为:
                      
                      异常处理
                      所谓异常就是指在程序运行期间发生的错误或意外情况。总之程序在运行期间出现异常是不可避免的,我们不能回避异常,而是要积极采取措施来控制和解决出现的异常现象。一般我们将产生异常的原因分为两种:由程序本身产生的和由程序运行环境(公共语言运行时环境)引起的。如果异常是由于运行的程序本身引起,则大多数情况下这种异常是可以恢复的;但如果异常是由于公共语言运行时环境所引起,则大多数异常难以恢复。
                      C#的异常处理指的是在程序中加入异常控制代码,使用try/catch语句块配合完成捕获异常和处理异常的任务。不能单独使用try或catch语句块,它们必须同时使用。通常情况下,try可配合多个catch子句,每个catch子句对应一种特定的异常,就好像switch…case语句一样。try/catch语句块基本格式如下:
                      
                      当try子句中的程序代码产生异常时,系统就会在catch子句中查找,看是否有与设置的异常类型相同的catch子句,如果有,就会执行该子句中的语句;如果没有,则转到调用当前方法的方法中继续查找。该过程一直继续下去,直至找到一个匹配的catch子句为止;如果一直没有找到,则运行时将会产生一个未处理的异常错误。
                      catch子句也可以不包含参数,即不包含对某种类型异常对象的捕获,这时catch子句将捕获所有类型的异常,这就好比switch…case语句中的default语句。
                      最后要说明一点:如果没有发生异常,那么try块正常结束,所有的catch语句被忽略,程序转到最后一个catch语句之后的第一条语句处开始执行。因此,只有发生异常,catch语句才会执行。
                      有时候,我们希望在执行完try/catch块后再做一些善后处理。如果想要在try/catch结束后再执行一些关闭资源的操作,就在程序中包含一个finally语句块,可以根据需要构成try…finally或try…catch…finally语句结构形式。
                      
                      try…catch…finally语句的执行功能:不论try块是正常退出,还是因为发生了异常而退出,最后执行的都是由finally语句定义的代码块。即使try块中或者任何catch语句中的代码从方法中返回,finally块也会得到执行。
 

更多复习资料
请登录电脑版软考在线 www.rkpass.cn

京B2-20210865 | 京ICP备2020040059号-5
京公网安备 11010502032051号 | 营业执照
 Copyright ©2000-2023 All Rights Reserved
软考在线版权所有