C程序设计实践教程课件

上传人:无*** 文档编号:230359764 上传时间:2023-08-24 格式:PPT 页数:177 大小:1.25MB
收藏 版权申诉 举报 下载
C程序设计实践教程课件_第1页
第1页 / 共177页
C程序设计实践教程课件_第2页
第2页 / 共177页
C程序设计实践教程课件_第3页
第3页 / 共177页
资源描述:

《C程序设计实践教程课件》由会员分享,可在线阅读,更多相关《C程序设计实践教程课件(177页珍藏版)》请在装配图网上搜索。

1、C#程序设计实践教程程序设计实践教程12第第1章章 Visual Studio.NET和和C#本章将为大家介绍一些.NET的设计原理以及Visual Studio.NET各元素之间的相互关系,这里我们不会使用Visual Studio.NET的集成开发环境(IDE)创建Windows应用程序,而是要扎实地介绍Visual Studio.NET编译器内部原理,以及Visual Studio.NET应用程序的内在元素。.NET Framework是Visual Studio.NET的基础,它是一种新技术。由于.NET Framework架构在应用程序开发环境中引入了执行操作的一种新方式,使得它有许

2、多概念初看起来都不是很容易掌握,我们将详细介绍.NET Framewrok的概念以及它与Visual Studio.NET编译器之间的关系。本章学习要点:了解C#.NET和Visual Studio.NET了解Visual Studio.NET的新功能了解.NET Framework与Visual Studio.NET之间的关系学习实现.NET Framework了解公共语言运行时的作用了解程序集的基础知识了解名称空间的组成了解.NET Framework类库学会创建C#.NET应用程序了解中间语言31.1 Visual Studio.NET与与C#.NET Visual Studio.NET

3、为我们提供了一种编写Windows应用程序的良好环境。很早之前要编写Windows应用程序时需要用到C+,对于初学者来说不但难学,而且在创建应用Windows应用程序时既复杂又费时,之后推出的Visual Basic简化了Windows应用程序的开发,简单易学但缺少一些C+拥有的复杂功能。但随着Visual Studio.NET和C#的推出变革了Windows的软件开发,不仅如此对其他类型程序的开发也有独到之处。41.1.1 Visual Studio.NET简介简介 Visual Studio.NET是.NET平台下最为强大的开发工具,无论是软件服务商,还是企业应用程序的部署与发布,Visu

4、al Studio.NET都可以提供近乎完美的解决方案。.NET开发平台是为简化在第三代Internet分布式环境下的应用程序开发,基于开发互联网标准和协议之上,实现异构语言和平台高度交互性,而构建的新一代和通信平台。.NET开发平台如下图所示:56 Visual Studio.NET提供了包括设计编码、编译调试、数据库联接操作等基本功能和基于开放架构的服务器组件开发平台、企业开发工具和应用程序重新发布工具以及性能评测报告等高级功能,下图为Visual Studio.NET 2003集成开发环境的操作界面。781.1.2 C#简介简介 C#是可用于创建要运行在.NET公共语言运行库上的应用程序

5、之一,它从C语言和C+语言演化而来,是Microsoft专门为使用.NET平台而创建的,并且吸收了以前许多教训,考虑了其他语言的许多优点。由于语法简单,使用C#开发应用程序比C+程序相对简单。但是,C#也是一种强大的语言,在C+中能完成的任务在C#中同样也能完成。C#的代码要比C+略长一些,这是因为C#是一种类型安全的语言(与C+不同),虽然C#的代码略长但其代码更健壮,调试也比较简单。C#是惟一为.NET Framework而设计的语言,是移植到其他操作系统上的.NET版本中使用的主要语言,能使用.NET Framework代码库提供的每种功能,如果要使用语言如VB.NET尽可能类似其以前的

6、语言,且仍遵循CLR,就不能完全支持.NET代码库的某些功能。9使用使用C#可以创建下面列出几种常见的应可以创建下面列出几种常见的应用程序的类型用程序的类型Windows应用程序Web应用程序Web服务101.2 .NET Framework与与Visual Studio.NET的关系的关系 Visual Studio.NET应用程序开发环境的核心就是名为.NET Framework的软件组件。.NET Framework定义了语言之间互相操作的规则,以及如何把应用程序编译为可执行代码;同时,.NET Framework还负责任何Visual Studio.NET语言创建的应用程序的执行,.N

7、ET Framework旨在实现下列目标:提供一个一致的面向对象的编程环境,而无论对象代码在本地存储和执行,还是在本地执行但在Internet上发布,或者在远程执行。提供一个将软件部署和版本控制冲突最小化的代码执行环境。提供一个可提高代码(包括未知的或不完全受任的第三方创建的代码)执行安全性的代码执行环境。提供一个可消除脚本环境或解释环境性能问题的代码执行环境使开发人员的经验在面对类型大不相同的应用程序(如基于Windows的应用程序和基于Web的应用程序)时保持一致。按照工业标准生成所有通信,以确保基于.NET Framework的代码可与任何其他代码集成。111.3 .NET Framew

8、ork结构结构 不管在Visual Studio.NET中使用何种.NET开发语言,都必须安装.NET Framework。这是因为它们都依赖于.NET Framework来编译和执行应用程序。.NET Framework主要由公共语言运行时和.NET Framework类库组成,它们分别定义了数据类型和.NET下语言的互操作性,构成了.NET Framework的基础。121.3.1 公共语言运行时公共语言运行时 .NET Framework核心组件就是公共语言运行时,它管理内存、线程执行、代码执行、代码安全验证、编译和其他系统服务等。这些功能是公共语言运行时上运行的托管代码所固有的。下面列

9、举出公共语言运行时提供的重要服务:1公共类型系统公共类型系统 2公共语言规范公共语言规范 3中间语言和中间语言和Just-In-Time编译器编译器 4执行管理执行管理 5垃圾回收机制垃圾回收机制131.4 程序集程序集 我们知道Visual Studio.NET把应用程序编译为中间语言文件,该文件的内容通常称为程序集。程序集(assembly)是.NET应用程序的原始的物理构造块,我们创建的每一个应用程序便是一个程序集。它是部署.NET应用程序的主要单元,它可以是动态链接库(dll)或者可执行文件(exe)。程序集具有以下特点:名称必须是全局唯一的保存身份程序集身份的信息,包括它文本命名和版

10、本号。程序清单描述了程序集的内容一个程序集可能会依赖于其他一个或多个程序集,因此程序集清单中还包含了一个依赖关系(dependencie)列表。程序集提供的所有类型和资源列表清单中还包含许可(permission)这些许可设置访问权限,指出哪些程序才可以访问程序集的内容141.5 命名空间命名空间 命名空间就是.NET框架中相关类和其他命名空间的集合。.NET Framework的类库中包含了大量的类,大约有了3500个类,所以在程序设计人员需要快捷的方法找到所需要的类。为此.NET Framework类库被分为许多命名空间,而在一个命名空间中包含了功能相似的类。它使用句号分隔的命名结构,将逻

11、辑上相关的类组织到一起,以便于查找和引用命名空间组织在程序集中定义的对象。程序集可以包含一个或多个命名空间,一个命名空间又可以保存在一个或多个程序集中,而命名空间可以包含其他命名空间。例如System和System.Data命名空间都被保存在System.dll程序集中,在创建的应用程序中也可以引入多个命名空间共同完成某项功能。命名空间避免了使用大的对象组(如类库)时的多义性并简化了引用。命名空间实际上也是分层的,这意味着一个命名空间可以包含另一个命空间,而后者又包含了更为类似的类。每一个类一定完全属于一个命令空间,它不会同时属于多个命名空间。151.6 创建创建C#.NET应用程序应用程序

12、前面我们讲解了.NET Framework的基础知识,这里我们就来创建一个C#控制台应用程序,利用这个应用程序来了解C#的语言的基本语法和编程结构,以及如何调用C#编译器,编译应用程序。在.NET Framework中,所有包含C#窗体、类等文件都具有后缀名为.cs,不能修改。我们知道.NET Framework允许我们使用文本编辑器来创建应用程序,不必使用IDE环境。161.7 Visual Studio.NET IDE 前面我们介绍了如何在命令提示窗口中调用C#编译器来编译在文本中的C#代码,这种方式只能让我们来熟悉C#的语法结构并设计简单的代码,一旦遇到庞大的工程时Visual Stud

13、io.NET的集成开发环境(IDE)便显示出巨大优势。1718第第2章章 C#基本语法基本语法 编程语言都要处理数据,而数据类型又是不相同的,要想使计算机了解这些数据,必须让程序语言描述出各种数据的类型和处理方法,本章主要介绍C#的基本语法,包括C#的数据类型、运算符。192.1 数据类型数据类型 在程序设计中,数据是程序的必要组成部分,是程序处理的对象。不同的数据有不同的数据类型,不同的数据类型有不同的数据结构和存储方式,并且参与的运算也不同。C#的数据类型采用了类似于C和C+语言的数据类型表示形式,但又有所改进。C#将所有的数据类型分为两大类:值类型和引用类型。202.1.1 值类型值类型

14、 值类型通常用来表示基本类型。如整型、实型、布尔型等基本数据类型都是值类型。C#的值类型主要包括:整数类型、布尔类型、实数类型、字符类型、结构和枚举类型。1整数类型整数类型2布尔类型布尔类型3实数类型和十进制类型实数类型和十进制类型4字符类型字符类型5结构类型结构类型6枚举类型枚举类型2.1.2 引用类型引用类型 引用类型与值类型相比,引用类型不存储实际数据,而存储实际数据的引用(即地址)。具体情况就是,当将一个数值保存到一个值类型变量后,该数值实际上复制到变量中;而把一个值赋值给一个引用类型时,仅是引用(保存数值的变量地址)被复制,而实际的值仍然保留在相同的内存位置。C#提供了以下几种引用类

15、型:类类型类类型 字符串类型字符串类型 数组数组 接口类型接口类型 委托类型委托类型212.1.3 装箱和拆箱装箱和拆箱 装箱和拆箱是C#类型系统的核心概念。通过允许一个值类型转换为引用类型或从一个引用类型转换成值类型,这种机制形成了值类型和引用类型之间等价连接。即任何数据都可以被看作对象。1装箱转换装箱转换2拆箱转换拆箱转换222.2 变量和常量变量和常量 无论编写任何应用程序,数据都必须以某种方式表示。变量和常量在编写应用程序时是经常用到的,变量和常量的使用让代码更具有可读性、更容易维护。232.2.1 变量变量 程序要对数据进行读、写、运算的等操作,当需要保存特定的值或计算结果时就需要用

16、到变量(Variable)。在计算机中变量代表存储地址,而变量的类型决定了存储在变量中的数值的类型。变量可以在定义时被赋值,也可以在定义时不赋值。在定义时赋值的变量也就有了一个初始值。变量的命名要符合标识符的命名规则,在命名时应给出具有描述性质的名称,这样写出来的程序便于理解。1初始化变量初始化变量2变量的作用域和生命期变量的作用域和生命期242.2.2 常量常量 带有const修饰符声明的变量称为常量,常量的值在程序执行过程中会改变,而常量代表的是永远不会改变的数据,声明常量时要设置常量值,例如:const int x=10;用const定义的常量,对于所有类对象而言都是一样的,因此需要像访

17、问静态成员那样去访问const定义的常量,而用对象的成员方式去访问会出变异错误。常量在声明的时候,可以在const修饰符前加上常量修饰符:public、protected、internal和private。252.3 运算符运算符 运算符在表达式中用于描述涉及一个或多个操作数的运算,它指明了进行运算的类型。在C#中,根据运算符所使用的操作数的个数,可以分为如下3类:一元运算符一元运算符二元运算符二元运算符三元运算符三元运算符 根据运算符执行的操作类型主要可分为如下几类:算术运算符算术运算符赋值运算符赋值运算符关系运算符关系运算符逻辑运算符逻辑运算符特殊运算符特殊运算符条件运算符条件运算符262

18、.3.1 算术运算符算术运算符 算术运算符是进行算术运算的操作符,它实现了数学上基本的算术运算功能,这些运算符包括:加法运算符、减法运算符、乘法运算符、除法运算符、取模运算符。1加法运算符加法运算符2减法运算符减法运算符3除法运算符除法运算符4取模运算符取模运算符272.3.2 赋值运算符赋值运算符 赋值就是给一个变量赋一个新值。1简单赋值简单赋值2复合赋值复合赋值3左移和右移赋值左移和右移赋值4其他赋值运算符其他赋值运算符282.3.3 关系运算符关系运算符 关系运算用来比较两个对象并返回布尔值,它的返回值总是布尔值。C#定义关系运算符的优先级低于算术操作符,高于赋值操作符。C#中关系操作符

19、主要包括:比较运算符、is运算符、as运算符。1比较运算符比较运算符2is运算符运算符3as运算符运算符292.3.5 特殊运算符特殊运算符 C#中还运用了一些特殊的运算符,用于完成特殊的任务。1new运算符运算符2typeof运算符运算符3checked和和unchecked运算符运算符3031第第3章章 控制语句控制语句 程序的基本组成单位是语句,按其功能可以分为两类:一类用于描述计算机执行的操作规程运算,称为操作运算语句;另一类是控制上述操作运算的执行顺序,称为控制语句。C#中也存在着控制语句,控制语句包括了三类:分支语句,包括if和switch语句;循环语句,包括了for、while、

20、do-while和foreach循环;跳转语句,包括了break、continue和return等语句。本章将结合大量实例详细讲解控制语句的使用方法,希望通过本章的学习,可以轻松掌握分支语句、循环语句和跳转语句的使用等,将在以后的程序设计道路上打下坚实基础。32本章学习要点本章学习要点掌握分支语句的使用方法掌握循环语句的使用方法掌握控制语句的嵌套了解break和continue的特点掌握跳转语句的使用333.1 分支语句分支语句 分支语句能实现选择控制结构,它包括了if和switch语句,其中if语句与else构成组合语句,来实现双重分支;利用switch语句来来实现多重分支结果的程序设计,i

21、f、else和switch语句都可以嵌套使用。计算机通过计算逻辑表达式来做出决策,并依据决策的结果来利用这些分支语句控制程序下一步要执行哪些代码。3.1.1 if语句语句 if语句是大部分程序流程控制结构的基础。if语句计算一个布尔表达式的值,并由此决定是否执行某一条语句。If语句的功能比较多,且变化灵活是进行分支决策的有效方式。下面我们详细讲解几种灵活的使用方式。1if语句语句2if/else组合组合3嵌套语句嵌套语句343.2 循环语句循环语句 在程序设计中有许多问题都要用到循环,例如,求若干个数的和、迭代求根等它们使用循环能多次执行同一个任务,直到完成程序的功能,这是程序设计中经常用到的

22、技术。循环是程序设计的基本语句之一,几乎所有的实用程序都包含了循环语句,熟练掌握它们是程序设计的基本要求。353.2.1 for循环循环 在大多数高级编程语言中(C+、Java)都有for循环语句,它的功能强大并且使用灵活,不仅可以用于循环次数确定的情况下,还能用于循环次数不确定的情况。for语句使用的语法形式为:for(表达式表达式1;表达式表达式2;表达式表达式3)循环体循环体;363.2.2 while循环循环 while循环语句是C#中不同于for语句的一种循环形式,它由循环条件和循体语句组成,使用while循环语句的语法形式如下所示:while(循环条件循环条件)循环体循环体;373

23、.2.3 do-while循环循环 do-while同样是由循环条件和循环体组成,但它while语句略有不同。do-while语句的特点为:先执行循环体,然后判断循环条件是否成立。使用它时的语法形式为:do 循环体循环体while(循环条件循环条件);383.2.4 foreach循环循环 foreach循环语句是C#中特有的,在C、C+和Java语言中并没有这种循环语句。它非常适合遍历数组中的元素,foreach很重要的优点是它不必去处理数组的下标。使用foreach时它的语法形式一般为:for(类型类型 标识符标识符 in 表达式表达式)循环体;循环体;393.3 跳转语句跳转语句 除了上

24、述的分支语句和循环语句外,还有一种特殊的程序控制语句,即跳转语句。跳转跳转语句用于需要从当前程序跳转到另一行程序执行代码的情况,C#中提供了多种跳转语句,详细介绍break、continue和return语句。403.4 求求值值 本节将编写一个程序用于计算值,这里就依据此公式来编写程序。413.5 编写编写C#帮助系统帮助系统 本节将为C#编写一个简单的帮助系统,系统用到多种控制语句,包括分支语句、循环语句和跳转语句,在帮助系统中可以选择何种语句的帮助信息,程序提供选择语句语法的一般形式。4243第四章第四章 函数函数 在程序中使用函数可以将若干条语句按照功能组织成一个独立的代码单元,这有利

25、于复杂程序的组织、管理,有利于编程人员分工协作、逐步实现复杂的功能,有利于代码的重复利用和维护。在C中,函数也称为方法,在未介绍面向对象的有关概念之前,暂时使用函数这一术语,在本书的第5章介绍C#面向对象编程时,还会对方法进行介绍。本章的主要内容包括:怎样在C#程序中定义和使用函数,结合函数介绍变量作用域的有关概念,使用重载函数的意义以及委托的基本概念。44本章学习要点本章学习要点在控制台应用程序中定义和使用函数通过返回值和参数,利用函数交换数据参数数组按引用或按值传递参数使用输出参数变量作用域的概念理解函数的重载委托的概念454.1 定义函数定义函数 要使用函数,首先需要定义函数。在函数的定

26、义中指定了函数所要完成的功能。函数的定义包含了两个部分:函数头和函数体。函数头是函数定义中的第一行,在左花括号之前;函数体位于花括号对中,它包含了调用函数时要执行的代码。1函数头函数头2函数体函数体3参数参数4.2 使用函数使用函数 在知道了怎样在C#代码中定义函数之后,下面介绍怎样在C#中使用函数。函数本来就是一个逻辑功能单元,使用函数的最基本目的就是让它实现某个功能;除了实现某个特定的功能之外,还可通过函数进行数据交换(主调函数和被调函数之间的数据交换),一种方式是使用函数的返回值,另一种方式是使用函数参数;使用函数的这两个目的并非总是截然分开的,例如,有时需要进行数据交换才能实现某个特定

27、的功能。464.2.2 参数参数 如果需要通过函数参数实现数据交换,必须在定义函数时,为函数指定要接受的参数列表,以及这些参数的类型;而且,在调用函数时要指定匹配的参数列表,即,实参的个数、类型和顺序要与形参的个数、类型和顺序保持一致,或者形参的类型能够兼容实参的类型。1关于参数匹配关于参数匹配2参数数组参数数组3引用参数和值参数引用参数和值参数4输出参数输出参数474.3 变量的作用域变量的作用域 本章的上一节介绍了怎样使用函数交换数据,但为什么需要使用函数交换数据呢?这就涉及到了变量的作用域问题。程序中定义的变量都具有特定的作用域,变量的作用域是指程序中哪些地方可以使用该变量。不同变量的作

28、用域可能是不同的,有的变量可以在程序的任何地方使用,而有的变量只能在程序的有限地方被使用。484.4 函数重载函数重载 在编程中常常需要使用两个或多个函数完成相同的任务,但其参数的数据类型不同。例如,需要使用larger()函数的不同版本,查找出任何基本数据类型的两个变量中的较大者。在理想情况下,所有这些函数都使用相同的名称larger(),另一种方法是为int类型的变量定义函数largerInt()为double类型的变量定义函数largerDouble(),这两个函数的作用是相同的,但却使用不同的名字,看上去很笨拙,不如前一种方法方便。在C#中,可以使用两个或两个以上具有相同名称只是参数声

29、明不完全相同的函数,这种情况称为函数的重载。概括地说,要重载函数,只需声明函数的不同版本,编译器会处理剩余的工作。但重载函数的不同版本之间必须至少满足下列所述的一个条件:参数数目不同参数数目不同参数类型不同参数类型不同参数的顺序不同参数的顺序不同494.5 委托委托 委托是一种变量类型,可以间接地使用函数。同一个委托可以调用匹配于特定函数签名的任何函数,提供在程序运行期间对几个函数进行选择的能力。由于委托跟面向对象的概念有关,在未介绍C#面向对象编程之前,本节只介绍与委托有关的部分知识。委托是一种可以把引用存储为函数的类型。委托的声明非常类似于函数,但没有函数体,而且要使用delegate关键

30、字。委托的声明指定了一个函数签名,其中包括返回类型和参数列表;在声明委托之后,就可以声明该委托类型的变量了,可将该变量初始化为与委托有相同签名的函数引用,然后,就可以使用委托变量调用这个函数。在具有可引用函数的变量后,还可以执行不能用其他方式完成的操作。例如,可以把委托变量作为参数传递给一个函数,这样,该函数就可以使用委托调用它引用的任何函数,而且,在运行之前无需知道调用的是哪个函数。5051第第5章章 C#面向对象编程面向对象编程 为了深入学习C#,我们需要了解C#的面向对象编程,面向对象编程是一种功能强大的程序设计方法,它以“数据控制访问代码”为主要原则,围绕数据来组织程序。在进行面向对象

31、编程时需要定义数据和作用于数据上的方法。这样,数据类型可以精确的定义出哪种类型的操作可以应用于该数据。类是面向对象编程的基础,在类中定义了数据和实现这些数据的代码。代码包含在方法中。类、方法是C#的基础。这一章介绍类的基础知识。52本章学习要点本章学习要点理解类的定义掌握声明类的方法掌握构造函数和析构函数方法理解并掌握访问修饰符的用法掌握类事件的声明以及为类定义事件535.1 类的基本概念类的基本概念 类是一个定义对象形式的模版。它指定了数据以及操作数据的代码。C#使用类的规范来构造对象,而对象是类的实例。从定义上来说,类是一个数据结构,包含数据成员(属性、字段)、功能成员(方法、事件、构造函

32、数和析构函数等)和嵌套类型。5.1.3 属性属性 属性是提供对对象或类的特性进行访问的成员。属性是字段的正常延伸都是与类型相关的有名称的成员,并且访问字段和属性的语法是相同的。不过,和字段不同的是:属性不指示存储位置。作为字段的替代,为了对它们的数值进行读写,属性有访问符来指定要执行的语句。这样,属性为读写对象的属性的相关行为提供了某个机制,并且它们允许那些属性可以被计算。属性是用相关类型成员命名。有存取程序,它指定声明的执行来对他们的进行读或写。属性的修饰符可以是public和protected、internal、private的有效组合、static、virtual、override或ab

33、stract中的一个。其中带static修饰符的为静态属性,带virtual修饰符的为虚拟属性,带override修饰符的为覆盖属性,带abstract修饰符的为抽象属性。545.2 重载成员重载成员 上一节中最后一个代码示例中,定义了多个方法F,主函数中也多次调用方法F。这就是重载。由于方法F的名字虽然相同,但它们在参数类型或参数个数上不同。这使得在这些重复调用的时候没有发生“冲突”。重载表示两个或两个以上的函数具有相同的名称不同的参数列表(包括参数类型和参数个数)。通过为多个方法指定相同的名称,但使它们具有不同的参数列表,可以在类中创建重载的方法。调用的时候根据参数列表的不同来正确的调用。

34、成员函数可以重载,就是说有两个或两个以上同名的成员函数,但它们的参数列表不同(参数类型和参数个数)。555.3 构造函数和析构函数构造函数和析构函数 构造函数是类的实例执行的时候的初始化操作。而析构函数是在类的破坏时自动执行的操作。构造函数的名称与类的名称相同,析构函数的名称是由“”和类名组成的。例如,如果一个类类名为Myclass,那么它的构造函数的名称是Myclass(),析构函数的名称是Myclass()。565.3.1 构造函数构造函数 构造函数是在类的实例执行时初始化的方法。由于这个特性使得构造函数成为需要执行的所有初始化任务(如设置变量和属性的初始值)的理想位置。每个类都有自己的构

35、造函数。在访问这个类的时候系统最先执行的就是这个构造函数。使用构造函数时需要注意:类的构造函数名要与类名相同。类的构造函数名要与类名相同。构造函数没有返回类型。构造函数没有返回类型。一般情况下构造函数是一般情况下构造函数是public类型的。类型的。不能显式的调用构造函数。不能显式的调用构造函数。575.4 访问修饰符访问修饰符 不管是在定义数据成员还是在定义功能成员时,在前面都要加上一些修饰符:public、protected、internal和private(修饰符private可以省去)。这些修饰符在前面也提到过,他们的作用是控制声明类型的可访问性。现在详细介绍一下它们控制声明类型的可访

36、问性。public、protected、internal和private叫做访问修饰符,用于指定声明的成员或类型的可访问性。585.5 类事件类事件 事件的定义是:在C#中,事件就是指当对象有重要情况发生时,类通知类的客户程序的办法。事件最为常见的用途就是图形用户界面,即当用户对界面控件进行操作时,如选择一个命令,就激发了表示控件的类的事件。简单的说,事件是使得类和对象提供通知的成员。用户在使用时,可以通过提供事件句柄来为事件添加可执行代码。5960第第6章章 继承及多态性继承及多态性 C#是一种面向对象的编程语言,它同样具有面向对象编程的一些特点。前面我们已经详细了解了类、对象、属性和构造函

37、数等,它们是面向对象的基础知识,这里我们为大家讲解面向对象编程的更深层次的问题,这些深入的问题包括了继承性、多态性和异常等其他一些相关的知识。继承性是从现有的类中派生出新类的功能,它能分析多态性的细微差别,并允许创建类层次结构,使用继承可以创建一个定义了多个相关项目共有特性的通用类;多态性对于初学者来说比较难以接受,要使多态发挥作用需要有复杂的条件;异常是C#中处理错误的机制。除了这些知识我们还将为你介绍C#中的作用域、抽象类和自定义异常处理等知识,本章的学习将为深入了解C#面向对象程序设计打下坚实的基础。61本章学习要点本章学习要点了解继承的概念掌握继承的使用方法了解作用域和继承的关系掌握抽

38、象类掌握重写成员了解构造函数和继承的关系掌握多态性掌握异常处理626.1 继承继承 继承是面向对象程序设计中一个很重要的特性,它是关于一个类怎么从另一个类中共享特性和行为的术语。在C#中继承类称为派生类或子类,被继承类称为基类或父类。如果一个派生类继承一个基类,那么这个派生类会从其基类中继承得到所有的操作、属性、特性、事件以及这些内容的实现方法,而基类中实例构造函数、析构函数和表态构造函数不会被继承,同时也不会继承那些显式拒绝访问的成员。派生类能够继承基类的方法、特性等,但继承得到的成员也受作用域的限制,即使派生类继承得到基类成员,也可能无法访问。对于作用域和继承的关系,我们将在下面的章节中为

39、大家详细讲解。6.2 作用域和继承作用域和继承 类中的实例变量有三种声明方式:public、protect和private。它们来控制访问成员的权限,继承一类不会超越private访问的限制。尽管一个派生类拥有其基类的所有成员,但它依然受到这三种声明方式的限制。C#中派生类无权访问其基类的private成员,但可以访问其public成员。派生类和外部代码都可以访问public成员。636.3 重写成员重写成员 在基类中的成员可能执行与派生类中同名成员的不同任务,或者派生类中成员必须提供基类中对应抽象成员的实现方式,这种过程称为重写。本节将详细为大家讲解重写成员的相关知识,同时详细介绍base关

40、键字的使用方法。646.4 抽象类与继承抽象类与继承 需要时我们创建一个基类,该类本身不提供已经实现的方法,只定义了所有子类共享的一般形式,至于实现方法的内容交给子类去填充。在这种情况下就需要一些方法来确保子类继承并实现基类中方法的必要条件,这里我们可以使用抽象类。定义抽象类的一般形式如下所示:public abstract class A .656.5 继承和构造函数继承和构造函数 基类成员的初始化工作由基类的构造函数完成,而派生类的初始化工作由派生类的构造函数完成。这就产生了派生类构造函数的执行顺序问题,即当创建一个派生类的对象时,如何调用基类和派生类的构造函数分别完成各自成员的初始化。同

41、时,在基类构造函数的继承性上了666.6 多态性多态性 多态性是面向对象程序设计中的又一个重要的概念,多态性是指通过基类引用,依靠执行多个派生类的方法,使程序执行动态操作。简单地说,多态是以同样的方法处理不同对象的能力。这样来说,就是对象的运行时刻的类型决定它的行为,而不是它的引用的编译时间时间的类型决定它的行为,这是一个动态的过程。C#中每种类型都是多态的。676.7 异常处理异常处理 也许你还记得第三章中,我们曾经写过一个简单的帮助系统,程序运行时会提示我们输入需要帮助的序号,但你有没有想过如果不输入程序提示的内容会出现什么情况?本节我们为大家讲解有关异常处理的问题,学完此节你就会对上面的

42、问题有所了解。686.7.1 管理异常管理异常 在C#中,程序中的运行时错误使用一种称为“异常”的机制在程序中传播。异常由遇到错误的代码引发,由能够更正错误的代码捕获。异常可由.NET Framework公共语言运行库(CLR)或由程序中的代码引发。异常由从Exception派生的类表示,程序中发生一个异常时,就会生成一个异常类的某种类型的对象。C#中使用try、catch、throw和finally四个关键字来管理的。1Try/catch块块2Finally块块6970第第7章章 数组与集合数组与集合 数组是一个数据结构。它包含了一些通过计算出来的标号来访问的变量。这些变量通常情况下被称为变

43、量的元素,它们都有相同的类型,这个类型被叫做数组的元素类型。简单的说,数组是指数据项的列表或集合。和C、C+中的数组一样,C#中的数组也是从零开始建立索引。也就是说在C#中数组第一个元素的下标为0,最后一个元素的下标为元素个数-1。本章介绍了数组的定义方法以及在函数中作为参数传递。集合类是System.Collections命名空间的数据结构。因为提供了为C#程序管理数据的各种方法,所以它们能够代替数组而且更灵活的管理对象组。本章介绍了集合的基本知识、使用类库中的集合的方法以及如何自定义集合。71本章学习要点本章学习要点掌握定义数组的方法。掌握数组在函数中的使用了解集合的概念掌握类库中的集合掌

44、握自定义集合的方法727.1 定义数组定义数组 C#中的数组包含一维数组、多维数组和数组的数组。其中数组的数组有时也叫锯齿数组。下面就逐一介绍。一维数组一维数组多维数组多维数组数组的数组数组的数组7.2 数组与函数数组与函数 数组作为一种数据类型,和其他数据类型一样,也可以作为参数在函数中传递。数组作为参数完成的方式和其他的out与ref参数的完成方式一样,即在调用函数之前不需要初始化out参数。不过,调用的函数必须在返回前分配数组类型。另外ref参数必须在函时调用之前分配。737.3 集合集合 介绍完数组,我们就会发现数组这个数据结构有一定的局限性。最大的限制就是一旦创建好数组,就不能对它的

45、大小进行改变,换句话说就是数组一旦创建好其大小就固定了。不可能在数组的末尾新添元素。如果必须对现有数组大小进行改变就只能新建一个数组,这意味着用于处理数组的语法比较复杂。为了简化处理数组的语法,我们引入了集合。集合是创建在C#内部并且可以进行一些处理的类。集合相对于数组而言,语法已经标准化。这使得利用集合进行处理的时候要比数组简单的多。集合的功能是通过执行System.Collections命名空间中的接口来实现的。在C#.NET中,集合都实现了ICollection接口。而ICollection接口是继承自IEnumerable接口,那么每个内建的集合因此也实现了IEnumerable接口。

46、C#中提供了很多集合,换个角度说,这些集合都在System.Collections命名空间中。每个集合都实现了ICollection接口。747.4 类库中的集合类库中的集合 实际应用中,有时需要数据结构(链表、堆栈、队列等)来完成计算任务。为便于这类应用,C#中System.Collections命名空间包含了几个能够被实例化的集合,这些可以被实例化的集合可以立即使用。它们就是类库中的集合。757.5 自定义集合自定义集合 上面介绍了如何使用高级集合类,这些高级集合类是封装在C#内部的,虽然应用时很方便,但是还是有很多人想要有自己的数据结构。这一节我们就来讨论如何创建自己的、强类型的集合。有

47、两种方式可以让我们自定义集合:一种方式是手动执行需要的方法,这比较花时间,在某些情况下也非常复杂。另一种方式是从一个类中派生出自己的集合,.NET提供了一个名为CollectionBase的基类,以便更容易创建自定义集合,CollectionBase是一个抽象基类,能够提供强类型集合。7677第第8章章 字符串字符串 使用和操作字符串是编程中的常见内容。在C中,可以使用两种类型的字符串,一种是String类的实例,另一种是StringBuilder类的实例;前者是不可更改的字符串,后者是可更改的字符串;这两种类型的字符串可以相互转换。String类型的字符串比StringBuilder类型的字

48、符串使用起来更方便,但当在程序中需要对字符串进行大量的修改时,一般应使用StringBuilder类型的字符串以提高程序的性能。本章主要介绍怎样在C#程序中使用和操作字符串,重点介绍String类和StringBuilder类提供的常用成员的作用,以及怎样使用这些常用成员操作字符串,另外,还介绍了怎样格式化字符串。78本章学习要点本章学习要点理解String类型字符串和StringBuilder类型字符串的异同学会创建和使用String类型的字符串实例了解String类的属性和索引器能够使用String类的常见方法操作字符串学会创建StringBuilder类型的字符串实例能够在StringB

49、uilder类型的字符串和String类型的字符串之间进行相互转换能够使用StringBuilder类的常见方法操作字符串了解怎样格式化字符串798.1 字符串基础字符串基础 字符串是由被当作一个整体处理的一系列字符组成的。一个字符串中包含的字符可以是大、小写英文字母、汉字、数字、以及*、#等特殊符号。首先了解一下字符。字符是组成C#程序代码的基本元素。源程序通常由字符组成,把一些字符按照一定意义组合,然后由编译器翻译成机器指令就可以完成指定的任务。除了普通字符之外,在程序中还包含着字符常量。字符常量可由一个整数值来表示,该值被称作字符码。例如,换行符n可用整数122来表示。字符常量是建立在U

50、nicode字符集基础之上的,Unicode字符集是一个通用的字符集,其中包含的符号和字母数量超过了ASCII字符集。C#当中的字符串分为两种:一种是不可变字符串,另一种是可变字符串。其中,不可变字符串是System命名空间中String类的对象(在本书前面的许多程序中用到的“string”关键字是String类的别名,也即,在C#程序中,可以在需要使用String的地方改用string替换),在本书前面的程序示例中用到的字符串大多都是这种类型的字符串;可变字符串是System.Text命名空间中StringBuilder类的对象。8.2 String类 C#中的String类类似于C+中的s

51、tring类型,但String类提供了更多的功能,有很多比较、读取和搜索String对象的内容的方法。虽然String类的功能很强,但String类型的字符串仍是不可改变的,也就是说,一旦创建了String类的对象实例,就不能够再修改该实例了。表面上看来能够修改字符串的所有方法其实都不能够修改已创建的String类对象实例,它们实际上是在原有String类对象实例的基础上创建了新的String类对象实例。当需要对字符串进行大量的修改时,可以使用StringBuilder类,关于该类的用法将在8.3节进行介绍。String类也是sealed类,也就是说,String类不能被继承。由于不可改变并且

52、是sealed类使得String类更加高效。下面将介绍String类的成员,并结合程序示例介绍怎样使用它们。808.2.5 提取字符串提取字符串 有时,需要从一个字符串中提取子串,使用String类的Substring方法可以解决这个问题。该方法具有两个重载版本,分别是:String Substring(int)该版本可从参数指定的位置该版本可从参数指定的位置开始提取子串,并返回这个子串。开始提取子串,并返回这个子串。String Substring(int,int)该版本可从第一个参数该版本可从第一个参数指定的位置开始提取子串,子串包含的字符个数由指定的位置开始提取子串,子串包含的字符个数由

53、第二个参数指定,然后返回这个子串。第二个参数指定,然后返回这个子串。818.3 StringBuilder类 如前文所述,String类型的字符串是不能修改的,如果要向String类型的字符串后面追加一个字符串,那么结果将是,用原有的字符串和要追加的字符串创建一个新的字符串,由于String类型的字符串的不可改变性,当程序中需要执行大量的字符串操作时,字符串的不可改变性将会导致程序的性能下降;但在C#中,还可以使用StringBuilder类型的字符串,它们是可以修改的,当需要完成大量的工作来修改字符串时,使用StringBuilder类型的字符串是最好的选择。828.3.2 使用Append

54、Format 除了能够将一些值追加到当前字符串之外,使用StringBuilder类的AppendFormat方法还能够追加格式化的字符串,有了AppendFormat方法,就不必再使用string类的Format方法,因而也就无需再创建多余的字符串了。AppendFormat方法有4个重载形式,分别为:AppendFormat(string,Object)AppendFormat(string,Object,Object)AppendFormat(string,Object,Object,Object)AppendFormat(IFormatProvider,string,Object)83

55、8.3.3 插入字符串 字符串的插入是StringBuilder类提供的另一个常用方法。插入字符串所用的Insert方法具有多个重载形式,其中的几种为:Insert(int,bool)Insert(int,char)Insert(int,char)Insert(int,Object)Insert(int,string,countInt)Insert(int,char,beginInt,numberInt)848.3.4 替换字符串 有时,会遇到这样的情况:在模板的基础上生成字符串,并用一些值来替换模板中的标记或子字符串。事实上,VS.NET也是这样工作的。每个项目都是在一个模板文件的基础上创建

56、的,新创建的源代码文件也是从一个模板生成的,然后根据项目类型、项目名称以及其他选项来替换文件中的各种标记。使用StringBuilder类的Replace方法也可以实现同样的效果,它能将字符串中所有指定的字符或字符串替换为其他指定的字符或字符串。该方法具有下列重载形式:StringBuilder Replace(char oldChar,char newChar)StringBuilder Replace(char oldChar,char newChar,int startIndex,int count)StringBuilder Replace(string oldValue,string

57、 newValue)StringBuilder Replace(string oldValue,string newValue,int startIndex,int count)858.4 格式化字符串 当使用Console.WriteLine()方法进行输出时,除非执行了特殊的格式化操作,否则任何格式的字符串都会默认为字符串类型。通常,各种不同类型的数据,例如,数字、字符串和日期等,需要进行更为完善的格式化。使用基本的字符串格式化可以将数据插入到字符串中的某些位置。这些插入位置是由带有序号的占位符来表示的,这些序号对应于插入项的顺序。8687第9章 Windows Form控件 窗体是.NE

58、T中的一种特殊的类,控件也是一种类,它继承于窗体类。它们可以像平常的类一样使用。使用窗体和控件,例如标签和文本框(它们是Windows窗体的固有部分),可以编写比较复杂的Windows窗体程序。窗体从基类System.Windows.Forms.Form中继承其基本行为,控件则直接或间接的继承了基类System.Windows.Forms.Control。这个基类确保Windows.Forms中的所有控件都拥有某些功能。本章主要介绍Windows Form中常见的控件及其功能。88本章学习要点本章学习要点学习如何管理窗体了解C#控件的用途掌握C#常用控件的使用设置控件的Tab顺序掌握C#事件处

59、理程序的创建方式掌握动态创建控件实例和事件处理899.1 解决方案解决方案 假定一个航班需要了解飞机座位占用情况,同时还要执行占座位操作。由于不同类型的飞机具有不同的座位配置,本章开发的应用程序的用途就是查看两种飞机类型的座位占用情况及执行占座位这一操作。在此解决方案中,应用程序的主窗体中,用户自行选择飞机类型并指定其他信息(航班号,航班的始发站和终点站)。应用程序利用用户指定的信息来显示一个包含座位信息的窗体。在座位信息窗体中,用户可以单击复选框来表示每个座位已经被占。在用户单击复选框时,窗体将会更新指示已经被占的座位数和空座位数的文本框内容。预览完整解决方案的步骤:(1)启动)启动.NET

60、,打开名为,打开名为WinForm.sln的解决方案文件。的解决方案文件。(2)按)按F5键运行解决方案。键运行解决方案。(3)查看飞机座位占用信息。)查看飞机座位占用信息。(4)占座位。)占座位。(5)清除占位信息。)清除占位信息。(6)结束解决方案,单击座位表窗体上的)结束解决方案,单击座位表窗体上的【Close】按钮关闭飞机按钮关闭飞机座位占用情况窗体,然后在主窗体中选择座位占用情况窗体,然后在主窗体中选择【File】|【Exit】命令。命令。9.2 管理窗体管理窗体 一个Windows应用程序可能不止包含一个窗体,当一个Windows应用程序包含多个窗体时就需要管理窗体。窗体管理包括设

61、置启动对象、窗体间切换等。下面就如何设置启动对象和怎样实现窗体切换简要介绍一下窗体管理。设置启动对象设置启动对象切换窗体切换窗体909.3 控件基础控件基础 .NET中的控件都派生于System.Windows.Forms.Control类。这个类定义了控件的基本功能,这就是控件中的许多属性和事件都相同的原因。许多类本身就是其他控件的基类,图9-5显示了Label和TextBoxBase类.919.4 事件处理事件处理 事件处理就是在事件驱动机制中,应用程序可以响应事件来执行一系列的操作。事件驱动机制是在Windows应用程序中由于用户操作(如单击鼠标或按某个键)、程序代码或系统内部而产生的“

62、事件”。这种基于事件驱动机制的事件处理是目前实现与用户交互的最好的方式。929.4.1 创建事件处理 双击控件实例或者窗体可以创建该控件或窗体的事件处理,但是这种创建事件处理的方法不能改变事件处理的名称。下面介绍一种可以改变事件处理名称的方法:首先选中需要创建事件处理的控件实例或窗口,然后打开属性窗口,在属性窗口上单击事件图标按钮。这时将显示该控件或该窗体的可以处理的所有事件。接着选定要处理的事件,在该事件的右侧框中键入事件处理程序的方法名称。最后按回车键完成事件处理程序的创建。939.4.2 动态创建事件处理 控件实例可以在运行时创建,那么相应的事件处理也可以在运行时创建。这两种操作互相影响

63、。因为在运行时创建了控件实例之后,对应的事件处理程序也需要创建。动态创建事件处理的步骤是:首先在动态创建控件实例的代码后添加创建事件处理的代码,代码的一般形式是:控件实例名.具体操作名+=new EventHandler(方法名);,然后打开事件处理程序添加响应此次操作的代码。9495第10章 MDI应用程序 一般情况下,编写Windows应用程序有三种方式:基于对话框的应用程序,它们给用户提供一个对话框,关在此对话框中显示了所有功能;单一文档界面应用程序(SDI),此应用程序显示给用户一个菜单、一个或多个工具栏和一个窗口来完成某些任务,如果需要创建一个新的任务,则需要再打开应用程序;多文档界

64、面应用程序(MDI),它的执行方式与SDI相同,但在同一任务窗口中可以打开多个任务。在本章节中我们将详细介绍在C#中如何创建多文档界面窗体(Multiple Document Interface,MDI)应用程序。同时完成一个完整的MDI应用程序的实例,将学习如何创建MDI父窗体(MDIFather)以及MDI子窗体(MDIChild)的其他相关窗体。另外,还将学习如何在MDI父窗体上添加菜单和其他控件,父窗体和子窗体之间合成菜单,并且创建上下文菜单(快捷菜单)。96本章学习要点本章学习要点理解MDI应用程序的特征组织MDI应用程序窗体之间的过程理解MDI应用程序的标准窗体的作用在MDI应用程

65、序中集成菜单并创建上下文菜单理解MDI应用程序的事件之间的关系配置RichTextBox控件来显示自定义字体和颜色使用RichTextBox控件读写文件格式化一个RichTextBox控件实例设置文本缩放检测Web页的链接9710.1 解决方案解决方案 在MDI应用程序中,每一个新的窗口都出现在另一个称为父窗体或父窗口的窗口中。MDI应用程序不是C#所特有的。有许多软件都是MDI应用程序,例如我们平时使用的Microsoft Word、Excel等软件,是典型的MDI程序的代表。在本章中我们将完成一个完整的MDI应用程序,它类似于Microsoft Word具有简单的文档编辑和处理功能。10.

66、1.1 界面设计原则界面设计原则 由于本章完成的是一个MDI的字处理应用程序,它有着统一的界面设置原则,如果不了解Windows程序界面设计的原则,或者不熟悉界面编程,就难以设计和实现既符合一般标准又具有特色的界面。界面的设计具有一般性的原则,其中最重要的有:保持界面的一致性保持界面的一致性提供常用操作的快捷键提供常用操作的快捷键提供简单的错误处理提供简单的错误处理提供信息反馈提供信息反馈操作应该可逆操作应该可逆设计良好的联机帮助设计良好的联机帮助9810.2 实现实现MDI程序程序 从完整的解决方案中我们大致了解了实现程序的基本功能,还有更多隐藏的内容是我们看不到的,首先先来了解一下MDI应用程序的特点,接着我们就依据这些功能来逐步实现本章的MDI字处理程序程序,并完成这些隐藏任务来完善MDI字处理程序。9910.2.1 MDI程序特征 多文档界面上父窗体和子窗体组成,其中父窗体称为子窗体的容器,而子窗体显示各自文档,所有子窗体具有相同的功能。MDI应用程序特点还不止,下面列举一些显著的特点:所有子窗体均显示在MDI父窗体的工作区中,用户可改变、移动子窗体的大小,但始终无法脱离父窗体

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!