C_培训课程讲义
- 格式:doc
- 大小:466.00 KB
- 文档页数:81
◆ 中科院计算所计算机职业技能培训中心 电话:(010)62563815 (010)62562476 第 1 页 共 81 页
培训网址:http://www.px1987.com, http://www.zktb.com.cn E-Mail:lylan@public.bta.net.cn Visual C# 语言编程技术
杨 少 波 中科院计算所计算机职业技能培训中心 北京中科天博计算机技术有限公司 目 录 .......…............................................................................………………………………1
第一讲、C#语言基础2
第二讲、C#中的类与对象编程、WINFORM控件的编程使用(一) 16 第三讲、C#中的类与对象、WINFORM高级控件的编程(二) 33 第四讲、C#中的类与对象、文件信息及文件数据编程(三) 44 第五讲、 C#的高级编程技术、WINFORM控件的编程(一) 56 第六讲、C#的高级编程技术、异常、代表、系统环境信息(二) 65 第七讲、VISUAL C#中的图形编程及IMAGE类和REGIONS、PATHS等 77
注意:本培训讲义中所用的特殊符号含义如下。 要点 实例 配置步骤&n 选学内容 ◆ 中科院计算所计算机职业技能培训中心 电话:(010)62563815 (010)62562476 第 2 页 共 81 页
培训网址:http://www.px1987.com, http://www.zktb.com.cn E-Mail:lylan@public.bta.net.cn 第一讲、 C#语言基础 [本讲的知识要点]:C#的特点、Main()函数的格式、C#中的数据类型、变量、常量、操作符、语句与控制流、数组编程技术、命名空间、.Net集成环境的使用等 1.1、C#语言简介 1.1.1 C# 语言产生的背景 (1)C和C++语言的优缺点:目前C和C++已经成为在商业软件的开发中使用最广泛的语言。它们为程序员提供了十分灵活的操作,不过同时也牺牲了一定的编程效率(需要更长时间来开发)。另外由于C/C++语言的复杂性,不易掌握。许多程序员都试图寻找一种新的语言,希望能在功能与效率之间找到一个更为理想的权衡点。 (2)应用需求的目标:对于C/C++程序员来说,最理想的解决方案无疑是在快速开发的同时又可以调用底层平台的所有功能。同时也想要一种和最新的网络标准保持同步并且能和已有的应用程序良好整合的环境。另外,一些C/C++开发人员还需要在必要的时候进行一些底层的编程。 (3)C#的产生:2000年7月微软推出C#,它是微软对上述问题的解决方案并成为构建各类组件的理想语言。C#也使得程序员可以快速地编写各种基于Microsoft .NET平台的应用程序。 (4)C#的主要特点:C#是一门设计简单(增加类型安全、自动垃圾回收、去掉指针、数据类型统一。并去掉了宏、模板、多重继承等)、面向对象(没有全局函数、变量或常量,全部实行类的抽象、封装、继承派生与多态)、类型安全(所有动态分配的对象和数组都被初始化为0;不能使用未初始化的变量;对数组的访问进行越界检查;不能写未分配的内存;算术操作进行溢出检查等)、灵活兼容(在.Net框架的支持下,可以在非安全代码中使用指针,并允许通过遵守.NET的CLS访问不同的API)的一门新型面向组件编程语言。其语法风格源自C/C++家族,吸收了Sun的Java的优点并融合了Visual Basic的高效和C/C++的灵活性、强大底层控制能力。 (5)为什么要开发C# ? ① C++语言的不足---伴随着开发的复杂性的增加,程序中的出错的概率以及调试、查错的难度也再不断增加。网络时代应用软件的开发必须按照网络时代的速度来进行; ② 对抗Java语言---C#综合了C/C++及Java的双重特性。 1.1.2、C#程序实例及程序结构分析 (1)程序实例(文本控制台程序): 1:using System; 2:class HelloWorld 3:{ public static void Main() 4: { //利用string str=Console.ReadLine()可以获得键盘输入,int val=Console.Read() 5: Console.WriteLine("Hello World !"); 6: } 7:} 将文件保存为HelloWorld.cs,其中".cs"是C#源代码文件的扩展名。然后编译该文件,可以得到编译输出文件HelloWorld.exe。执行它时可得到下面的输出:Hello World ! (2)程序结构分析: 注释语句---和Java语言类似,C#支持三种注释方法:以"//"开始的单行注释和以"/*","*/"配对使用的多行注释、“///”的文档注释。注释之间不能嵌套。 再看上面的"using System;"语句,这是C#语言的using命名空间指示符,利用它来导入一个名字空间中的内容,这样在程序中就可以直接使用该空间中的元素。这里的"System"是Microsoft.NET系
请注意C#中的Main()定义格式 ◆ 中科院计算所计算机职业技能培训中心 电话:(010)62563815 (010)62562476 第 3 页 共 81 页
培训网址:http://www.px1987.com, http://www.zktb.com.cn E-Mail:lylan@public.bta.net.cn 统提供的类库(C#语言没有自己的语言类库)。
在程序中声明并实现了一个含有静态Main()函数的HelloWorld类。C#所有的声明和实现都要放在同一个文件里(不像C++那样可以将两者分离!)。Main()函数在C#里非常特殊,它是编译器规定的所有可执行程序的入口点。由于其特殊性,对Main()函数有以下几条准则: Main()函数必须封装在类或结构里来提供可执行程序的入口点; C#采用了完全的面向对象的编程方式不可以有像C++那样的全局函数; Main()函数必须为静态函数(static)。这允许C#不必创建实例对象即可运行程序; Main()函数保护级别没有特殊要求,public,protected,private等都可,但一般我们都指定其为public;Main()函数名的第一个字母要大写,否则将不具有入口点的语义。 C#是大小写敏感的语言。Main()函数的参数只有两种参数形式:无参数和string 数组表示的命令行参数,即static void Main()或static void Main(string[]args) ,后者可以接受命令行参数; 一个C#程序中只能有一个Main()函数入口点。C#不推荐通过其他参数形式重载Main()函数,这会引起编译警告; Main()函数返回值只能为void(无类型)或int(整数类型)。其他形式的返回值不具有入口点语义。 其中Console是在命名空间System下的一个类,它表示我们通常打交道的控制台。调用其静态方法WriteLine()(回车换行,而Write()不回车换行)接受字符串类型的参数"Hello World !",并把它送入控制台显示。 编译完后的HelloWorld.exe根本不是一个可执行文件!它是一个由中间语言(IL)、元数据(Metadata)和一个额外的被编译器添加的目标平台的标准可执行文件头组成的PE(portable executable,可移植执行体)文件,而不是传统的二进制可执行文件。IL是一组独立于CPU的指令集,它可以被即时编译器翻译成目标平台的本地代码。 IL代码使得所有.NET平台的高级语言如C#、VB.NET、VC++.NET等得以平台独立,以及语言之间实现互操作和混合编程(但其缺点是易被反编译)。元数据是一个内嵌于PE文件的表的集合。元数据描述了代码中的数据类型等一些通用语言运行时(Common Language Runtime)需要在代码执行时知道的信息。元数据使得.NET应用程序代码具备自描述特性,提供了类型安全保障。 1.1.3、 PE文件的执行过程分析 用户执行编译器输出的应用程序(PE文件),操作系统载入PE文件以及其他的DLL(.NET动态连接库)。操作系统装载器根据前面PE文件中的可执行文件头跳转到程序的入口点。显然,操作系统并不能执行中间语言,该入口点也被设计为跳转到mscoree.dll(.NET平台的核心支持DLL)的CorExeMain()函数入口。 CorExeMain()函数开始执行PE文件中的IL代码。CLR用即时编译器将IL编译成本地机二进制代码,执行并根据需要存于机器缓存。在程序的执行过程中,垃圾收集器负责内存的分配,释放等管理功能。程序执行完毕,操作系统卸载应用程序。 1.1.4、C#程序的编译与执行步骤 (1)编辑C#源程序,程序文件名后缀为.cs。 (2)使用C#语言编译器对C#源程序进行编译,产生一个受控代码文件(.EXE或.DLL),该文件是一个有效的.PE格式文件。 (3)在执行.exe或.dll文件时,CLR的类加载器负责装载所需类型,并且为类型的每个方法创建并连接上一段占位代码。 (4)当要执行的方法是第一次被调用时,该方法的占位代码将控制转移给及时编译器(CLR针对每种体系结构的计算机提供一种或多种及时编译器,这些编译器会根据机器体系结构的不同把IL中间代码编译成为目标机上的可执行的本地代码),由它将方法的IL代码转换为目标机器上的本地代码并进行类型安全检查,并用及时编译后的方法本地代码的地址替代占位代码,然后执行方法的本地代码。以后再要运行该方法,就执行编译后的本地代码。