




已阅读5页,还剩1页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第17章 组织应用程序目 标学习完本章之后,你应该能够掌握以下概念: 什么动态连接库 什么是命名空间 如何使用命名空间 解决方案、项目、源文件、类、程序集之间的关系引 言在传统的Windows 应用程序中,动态链接库Dynamic-Link Library DLL 是一个非常重要的组成部分。在建立应用程序的可执行文件时,不需要将DLL 链接到程序中,而是在程序运行时动态装载DLL 。除了很小的程序以外,实际工作的一个应用程序通常都由若干的编译单元共同组成。出于方便,我们常常将大型的程序分为若干个相互联系的可执行程序和动态链接库。有经验的程序员一定深有体会,使用现有的各种语言开发工具来编写动态链接库是一件非常困难同时又是非常需要耐心的事情。然而现在你将会发现,用C#来编写动态链接库和写简单的可执行程序几乎没什么两样,只要一些简单的标记编译器将会为我们完成绝大多数的工作。C# 程序是通过使用命名空间来组织的命名空间,即可以作为应用程序的内部结构体系, 也可以作为应用程序的外部结构体系。在作为外部结构体系时,程序中的一些元素可以被导出到其它的程序。使用指示符导入命名空间有助于使用方便。17.1 基本概念17.1.1 动态链接库你是否有过这样的经历,在配置不是很好的机器上运行一些不是很完善的Windows 应用程序,系统速度越来越慢,直至弹出一个警告对话框,系统资源严重不足请关闭部分Windows 应用程序,这往往是静态链接的缘故。使用普通的函数库,在程序链接时将库中的代码拷贝到可执行文件中这叫作静态链接。假设有多个程序同时执行并且都调用了同一个动态链接库,这时内存中就会保留许多重复的代码副本。使用动态链接库则不一样,只有程序在执行时才将库代码装入内存,对于同一个动态链接库无论有多少个应用程序同时在使用它,内存中都只有一个动态链接库的副本。如果动态链接库不再被任何程序使用,系统就将它调出内存,这就减少了应用程序对内存的要求。动态链接库是一种程序模块,它不仅可以包含可执行代码,而且通常还包含了各种类型的预定义的数据和资源,扩大了库文件的使用范围。Windows 操作系统使用了许多动态链接库,比如我们使用Visual C+建立MFC 应用程序时,如果在AppWizard向导中选择了使用MFC 作为动态链接库,那么所有这种类型的程序至少都共用了C:WindowsSystem 目录下的MFC 动态链接库文件Msvcrt.dll 和Mfc42.dll ,许多设备的驱动程序也是用动态链接库实现的,扩展名一般为.drv。动态链接库技术常常用于开发大型软件系统,一个大型系统如果只通过一个可执行文件来完成那程序就太庞大了,而且可能有许多重复的功能,这时如果将程序分解由一系列主程序和动态链接库组成,这就减少了开发难度和工作量,提高了访问的速度,更有利于对整个系统的管理。动态链接库的另一个用途是,软件产品国际化开发人员可以将依赖于各国语言的资源分离开来各自放进专门的动态链接库中,各国不同的用户可以在安装和运行时选择适当语言版本的动态链接库,这样主程序不用改变就可以用于全球范围。这是实现软件国际化的一项技术,知道了动态链接库的这些特点,相信读者不难明白为什么动态链接库的应用那么广泛了。17.1.2 编译单元我们再首先介绍一下编译单元Compilation units 的概念,顾名思义编译单元是能够被编译器进行编译的最小单位。编译单元定义了源文件的整体结构,一个编译单元的声明格式如下:using-directives attributes namespace-member-declarations一个C#程序包含了一个或多个编译单元,每一个编译单元包含在一个独立的源文件中,当C#程序被编译时,编译器对程序的所有编译单元进行统一处理,编译单元也可能互相依赖。编译单元的使用指示符只对本单元的属性和命名空间成员声明产生影响,但不会影响到其它的编译单元。17.1.3 命名空间和装配到现在为止,除了依赖于一些系统提供的类,比如一开始我们就提到的System.Console 类,我们介绍的程序主要都是依靠自身来实现的。但更普遍的情况是,现实世界中的应用程序可能包含许多不同的部分。举个例子,一个应用程序系统可能需要依赖于许多不同的组件,一些是内部开发的,另一些是从别的软件开发商处购买的。使用命名空间和装配使得这种基于组件的系统成为可能,命名空间提供了一个逻辑上的层次结构体系,它即可以作为应用程序的内部结构体系,也可以作为应用程序的外部结构体系。在作为外部结构体系时,程序中的一些元素可以被导出到其它的程序。装配用于应用程序的打包packaging 和部署deployment ,装配和模块所扮演的角色类似都可以作为类型的物理容器,一个装配可能包含若干个相互独立的模块,可以包含许多类型、作用于这些类型上的可执行代码以及对其它装配的引用。装配有两种类型,应用程序和库应用程序都有一个入口通常扩展名为.exe库,则不包含入口通常扩展名为.dll。17.2 使用命名空间17.2.1 命名空间的声明命名空间的声明是,关键字namespace 后跟命名空间名和命名空间主体,然后还可以跟一个分号格式如下:namespace qualified-identifier namespace-body ;命名空间的声明要么在编译单元源文件的第一行出现,要么作为成员出现在其它命名空间的声明之中。首次声明的命名空间是全局命名空间的成员,在别的命名空间内部声明的命名空间作为外部命名空间的成员。在这两种情况下,命名空间都不允许出现重名。命名空间隐式地使用public 修饰符,在声明时不允许使用任何访问修饰符。下面这种形式可以采用非嵌套的语法来实现命名空间的嵌套声明:namespace N1.N2class A class B 上述代码等价于namespace N1namespace N2class A class B 17.2.2 成员与类型声明 命名空间的成员可以是一个类型(类、结构、接口、枚举或代表),也可以是另一个命名空间。一个编译单元或命名空间主体中可以包含多个成员声明,这些声明给编译单元或命名空间主体中添加了新的成员。命名空间中的类型声明可以是类的声明、结构的声明、接口的声明、枚举的声明,或者是代表的声明。一个类型声明可以在编译单元的第一行,作为顶层声明出现,也可以出现在编译单元的内部,作为成员声明。类型声明还可以是在命名空间、类或结构的内部作为成员声明出现。对类型声明的访问权限与类型声明所处的位置有关: 对在编译单元中一开始就声明的类型,访问权限可以是公有public 的,也可以是内部internal 的。默认的访问权限是内部的。 在类中声明的类型访问权限可以是公有public的、保护protected的、内部internal 的或是私有private 的,默认的访问方式是私有的。在结构中声明的类型访问权限,可以是公有public 的、内部internal 的或是私有private 的,默认的访问方式是私有的。17.2.3 改写Welcome 程序为了演示命名空间的基本用法,我们把“Welcome” 程序分为库和控制台两部分。库用来提供显示的消息,控制台程序执行显示。首先让我们看一下库文件,其中包含了一个WelcomeMessage 类。/ 库文件WelcomeLibrary.csnamespace MyProgram.CSharp.FirstApppublic class WelcomeMessagestring m_message;public WelcomeMessage()m_message = “Welcome !”;public string Message get return m_message;set m_message = value;上面的代码展示了在命名空间MyProgram.CSharp.FirstApp 定义的类WelcomeMessage ,类WelcomeMessage 提供了可读的属性Message, 我们看到命名空间可以嵌套。比如声明:namespace MyProgram.CSharp.FirstApp实际上是以下多层命名空间的嵌套namespace MyProgramnamespace CSharpnamespace FirstAppWelcome 程序组件化的下一步就是编写客户控制台程序,客户程序将使用库中提供的类WelcomeMessage, 实际上WelcomeMessage 这个类的全名应该是MyProgram.CSharp.FirstApp. WelcomeMessage ,但这种方法使用的书写的名字太长,显得过于笨拙。一个简单的方法是预先导入命名空间,这样就可以不通过全名来使用命名空间的所有类型。/ 客户程序源文件WelcomeApp.csusing System;using MyProgram.CSharp.FirstApp;class WelcomeApppublic static void Main() WelcomeMessage M = new WelcomeMessage();System.Console.WriteLine(M.Message);System.Console.WriteLine(“Please Enter your name:”);string input = System.Console.ReadLine();M.Message = “Welcome” + input;System.Console.WriteLine(M.Message);上例中导入了命名空间MyProgram.CSharp.FirstApp 后,每次出现的WelcomeMessage 实际上就是MyProgram.CSharp.FirstApp. WelcomeMessage 的简写。我们写的代码可以编译后产生一个包含类WelcomeMessage 的库,以及一个包含类WelcomeApp 的应用程序。17.3 使用指示符使用指示符的目的是为了方便使用其它的命名空间中定义的命名空间和类型。命名空间的指示符有两种别名,使用指示符(using-alias-directive) 和命名空间使用指示符(using-namespace-directive)。17.3.1 别名使用指示符C# 支持使用别名,别名使用指示符定义一个别名。以后就可以使用这个别名来代替一个类型,这在两个库的名字可能发生冲突的情况下非常有用。别名还可以避免使用冗长的命名空间。如下面的代码定义了MessageSource 作为类WelcomeMessage 的别名using MessageSource = MyProgram.CSharp.FirstApp. WelcomeMessage;别名使用指示符为我们提供了一个标识符,在整个编译单元或是在命名空间主体之中,这个标识符作为命名空间或类型的别名。别名使用指示符的语法格式为:using identifier = namespace-or-type-name ;可以在成员声明中包含别名使用指示符,这个别名可以用来指代命名空间,也可以用来指代类型。例如:namespace N1.N2class A namespace N3using A = N1.N2.A;class B: A 17.3.2 命名空间使用指示符使用命名空间指示符,为编译单元或命名空间主体导入了另一个命名空间的类型。对这些类型的使用无需全名。使用命名空间指示符的语法格式:using namespace-name ;在编译单元或命名空间的成员声明中命名空间中,包含的类型可以被成员直接使用。例如:namespace N1.N2class A namespace N3using N1.N2;class B: A 一个命名空间使用指示符导入了在给出的命名空间中包含的类型,但没有引入嵌套的命名空间。见下例:namespace N1.N
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 虚拟与实体结合的购物体验平台建设
- 团队协作与领导力作业指导书
- 健康生活作息指南
- 电商物流配送优化计划
- 中级银行从业资格之中级银行业法律法规与综合能力题库(得分题)打印含完整答案详解(有一套)
- 自考专业(法律)经典例题及参考答案详解
- 2025年网络安全与社会稳定风险分析报告
- 环保公司行政管理办法
- 2025年跨境电商供应链金融服务平台申请报告
- 环保公司同业合作管理规章
- 江苏文化和旅游厅事业单位笔试真题2024
- 实验室生物安全管理手册
- 病理科实验室生物安全评估表
- 成人学习者数字素养的培养
- 管理会计模拟实训实验报告
- (正式版)JBT 11270-2024 立体仓库组合式钢结构货架技术规范
- 新闻采访课件
- 上市公司合规培训
- SPACEMAN(斯贝思曼)冰淇淋机 安装调试培训
- 利润分成合同
- 眼镜店市场可行性分析方案
评论
0/150
提交评论