命令行说明中括号的含义

  • [ ]:内的内容表示可写可不写
  • { }:至少选择大括号内的一个
  • < >:必写项
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
《计算机应用基础》 期末作业考核 一、计算题 1.存储800个24×24点阵汉字字形所需的存储容量是多少字节? 答:是57600字节 2.将二进制数1010.11转换为对应的十进制数。 答:是10.75 二、简答 1.什么叫位?什么叫字节?什么叫字长?字长表示了计算机的什么特点? 答:位(bit)一个二进制数可以理解为1位,(0101)4位 ,(00111)5位 8个二进制位就是一个字节,ASCII码规定英文字符用低三高四,7个二进制数表示,最高 位补0,一个英文字母在计算机内占用的存储空间就是8bit(位)=1Byte(字节) 字长:运算性能参数,单位也是位。比如CPU有32bit的和64bit的,这里就是字长,表示 CPU一次运算能处理多少个二进制数,当然字长越大运算性能也相对越高。 2.如何在Windows的桌面上、开始菜单创建一个应用程序的建快捷方式? 答:在Windows 98的开始菜单上为桌面建立快捷方式的步骤为:   1单击Windows 98的"开始"菜单,依次选择"设置/任务栏",启动Windows 98的"任务栏属性"对话框。   2在"任务栏属性"对话框单击"开始菜单程序"选项卡。   3单击"添加"按钮,系统弹出"创建快捷方式"对话框 4在"命令行"栏输入"C:\WINDOWS\EXPLORER.EXE /root,C:\WINDOWS\Desktop"   5单击"下一步"按钮。   6系统弹出"选定'程序'文件夹"对话框,要求用户选择将该快捷方式存放在那一级菜 单,我们一般应选择"Start Menu"项   7单击"下一步"之后,系统会要求我们为该快捷方式指定一个名称,我们只需将其取 名为"桌面"即可   8单击"确定"按钮,关闭"任务栏属性"对话框。 3.在Excel,如何输入公式? 答:如下所示问题是:将下面样表的数据,在A4单元格计算总和。 "样表"A " "1 "1203.11 " "2 "1104.56 " "3 "1178.29 " "4 " " 说明:上表A为列号,左侧1-4为行号。 方法是:单击a4单元格(a4单元格的位置是第A列,第4行交叉的那个单元格,也即是我 们彩色实例的那个位置),在键盘上输入 =a1+a2+a3 ,然后按键盘的enter键(回车键)即可完成使用公式计算(结果3485.96) 要想正确输入excel公式,必须要谨记以下要点: 1、公式必须以 = 开始。不管是单纯的公式还是更高级的函数使用,都需要以 = 为开始标记,否则,所有的公式只是字符,而不能完成计算功能; 2、准确使用单元格。公式用到的数据单元格名称要看清楚,A、B、C、D是列号,1、 2、3、4、5、6是行号; 3、正确使用函数。所有公式的函数都是以英文小括号 ( ) 成对出现,不能少了左边或者右边,使用函数时可以自己输入也可使用插入函数的方法 ,但不可拼写错误; 4、公式以键盘 enter 键的输入结束。以=开始,以enter键输入结束是公式最基本的要求,千万不能在公式输 入完毕后没有按enter键的情况下点击鼠标,公式将会遭到破坏; 4.如何播放演示文稿? 答:1、"开始"—"从当前幻灯片开始播放"—"从当前幻灯片开始播放",也可以使用快捷键 "Shift+F5"。 2、点击软件下方"从当前幻灯片开始幻灯片播放"的小按钮。 3、选择"开始"—"从当前幻灯片开始播放"—"从头开始"。 5.在Word"复制"和"剪切"的区别是什么?在什么情况下使用"复制",什么情况下使用 "剪切"? 答:在Word 2007,复制与粘贴的动作就是复制,一般用于前面的内容已经存在,或者相差不多, 这时我们用复制,快捷键是Ctrl+C,粘贴是Ctrl+V,剪切和粘贴的按钮用于移动文本, 一般你觉得某段文本与另一段文本的次序不对,就可以用剪切的功能,快捷键是Ctrl+X 。 三、论述 1.详述计算机系统的主要技术指标,并举例说明它们的含义。 答:一、字长 字长就是计算机运算器进行一次运算所能处理的数据的位数。如字长为16位的计算机、 运算一次便可处理16位的二进制信息。字长不仅标志着计算精度,也反映计算机处理信 息的能力。一般情况下,字长越长,计算精度越高,处理能力越强。目前,微型机以16 位、32位为主,工作站、小型机以32位为主,大型机都在32位以上。字长有时也用字 节为单位表示,一个字节表示8个二进制位。若机器字长为16位,也可以说字长为2字节 。 二、存储容量 存储容量分为主存容量和外存容量。主存容量多以千字节(KB)为单位,如6k,256KB等。 对于主存容量一般应指明装机(基本内存)是多少,能否加以扩充,最大容量是多少。外 存容量主要指磁盘、磁鼓、磁带的容量。存储容量的大小根据应用的需
WIN XP蓝屏代码大全 一、蓝屏含义 1、故障检查信息 ***STOP 0x0000001E(0xC0000005,0xFDE38AF9,0x0000001,0x7E8B0EB4) KMODE_EXCEPTION_NOT_HANDLED ***其错误的第一部分是停机码(Stop Code)也就是STOP 0x0000001E, 用于识别已发生错误的类型, 错误第二部分是被括号括起来的四个数字集, 表示随机的开发人员定义的参数(这个参数对于普通用户根本无法理解, 只有驱动程序编写者或者微软操作系统的开发人员才懂). 第三部分是错误名. 信息第一行通常用来识别生产错误的驱动程序或者设备. 这种信息多数很简洁, 但停机码可以作为搜索项在微软知识库和其他技术资料使用 2.推荐操作 蓝屏第二部分是推荐用户进行的操作信息. 有时, 推荐的操作仅仅是一般性的建议(比如: 到销售商网站查找BIOS的更新等); 有时, 也就是显示一条与当前问题相关的提示. 一般来说, 惟一的建议就是重启. 3.调试端口告诉用户内存转储映像是否写到磁盘商了, 使用内存转储映像可以确定发生问题的性质, 还会告诉用户调试信息是否被传到另一台电脑商, 以及使用了什么端口完成这次通讯. 不过, 这里的信息对于普通用户来说, 没有什么意义.有时保卫科可以顺利的查到是哪个生产小组的问题, 会在第一部分明确报告是哪个文件犯的错, 但常常它也只能查个大概范围, 而无法明确指明问题所在. 由于工厂全面被迫停止, 只有重新整顿开工, 有时, 那个生产小组会意识到错误 , 不再重犯. 但有时仍然会试图哄抢零件, 于是厂领导不得不重复停工决定(不能启动并显示蓝屏信息, 或在进行相同操作时再次出现蓝屏). 二、蓝屏的处理方法 Windows 2K/XP蓝屏信息非常多, 无法在一篇文章全面讲解, 但他们产生的原因往往集在不兼容的硬件和驱动程序、有问题的软件、病毒等, 因此首先为大家提供了一些常规的解决方案, 在遇到蓝屏错误时, 应先对照这些方案进行排除. 1.重启 有时只是某个程序或驱动程序一时犯错, 重启后他们会改过自新.(注意:此时参见7.查询停机码) 2.新硬件 首先, 应该检查新硬件是否插牢, 这个被许多人忽视的问题往往会引发许多莫名其妙的故障. 如果确认没有问题, 将其拔下, 然后换个插槽试试, 并安装最新的驱动程序. 同时还应对照微软网站的硬件兼容类别检查一下硬件是否与操作系统兼容. 如果你的硬件没有在表, 那么就得到硬件厂商网站进行查询, 或者拨打他们的咨询电话. Windows XP的硬件兼容列表 Windows 2K的硬件兼容类别 3.新驱动和新服务 如果刚安装完某个硬件的新驱动, 或安装了某个软件, 而它又在系统服务添加了相应项目(比如:杀毒软件、CPU降温软件、防火墙软件等), 在重启或使用出现了蓝屏故障, 请到安全模式来卸载或禁用它们. 4.检查病毒 比如冲击波和振荡波等病毒有时会导致Windows蓝屏死机, 因此查杀病毒必不可少. 同时一些木马间谍软件也会引发蓝屏, 所以最好再用相关工具进行扫描检查. 5.检查BIOS和硬件兼容性 对于新装的电脑经常出现蓝屏问题, 应该检查并升级BIOS到最新版本, 同时关闭其的内存相关项, 比如:缓存和映射. 另外, 还应该对照微软的硬件兼容列表检查自己的硬件. 还有就是, 如果主板BIOS无法支持大容量硬盘也会导致蓝屏, 需要对其进行升级. 小提示: BIOS的缓存和映射项 Video BIOS Shadowing (视频BIOS映射) Shadowing address ranges(映射地址列) System BIOS Cacheable(系统BIOS缓冲) Video BIOS Cacheable(视频BIOS缓冲) Video RAM Cacheable(视频内存缓冲) 6.检查系统日志 在开始-->菜单输入:EventVwr.msc, 回车出现"事件查看器", 注意检查其的"系统日志"和"应用程序日志"表明"错误"的项. 7.查询停机码 把蓝屏密密麻麻的E文记下来, 接着到其他电脑上网, 进入微软帮助与支持网站http://support.microsoft.com?, 在左上角的"搜索(知识库)"输入停机码, 如果搜索结果没有适合信息, 可以选择"英文知识库"在搜索一遍. 一般情况下, 会在这里找到有用的解决案例. 另外, 在baidu、Google等搜索引擎使用蓝屏的停机码或者后面的说明文字为关键词搜索, 往往也会有以外的收获. 8.最后一次正确配置 一般情况下, 蓝屏都出现于更新了硬件驱动或新加硬件并安装其驱动后, 这时Windows 2K/XP提供的"最后一次正确配置"就是解决蓝屏的快捷方式. 重启系统, 在出现启动菜单时按下F8键就会出现高级启动选项菜单, 接着选择"最后一次正确配置". 9.安装最新的系统补丁和Service Pack 有些蓝屏是Windows本身存在缺陷造成的, 应此可通过安装最新的系统补丁和Service Pack来解决. 三、蓝屏代码含义和解决方案 1、0x0000000A:IRQL_NOT_LESS_OR_EQUAL ◆错误分析:主要是由问题的驱动程序、有缺陷或不兼容的硬件与软件造成的. 从技术角度讲. 表明在内核模式存在以太高的进程内部请求级别(IRQL)访问其没有权限访问的内存地址. ◇解决方案:请用前面介绍的解决方案的2、3、5、8、9方案尝试排除. 2、0x00000012:TRAP_CAUSE_UNKNOWN ◆错误分析:如果遇到这个错误信息, 那么很不幸, 应为KeBudCheck分析的结果是错误原因 未知. ◇解决方案:既然微软都帮不上忙, 就得靠自己了, 请仔细回想这个错误是什么时候出现的; 第一次发生时你对系统做了哪些操作; 发生时正在进行什么操作. 从这些信息找出可能的原因, 从而选择相应解决方案尝试排除. 3、0x0000001A:MEMORY_MANAGEMENT ◆错误分析:这个内存管理错误往往是由硬件引起的, 比如: 新安装的硬件、内存本身有问题等. ◇解决方案:如果是在安装Windows时出现, 有可能是由于你的电脑达不到安装Windows的最小内存和磁盘要求. 4、0x0000001E:KMODE_EXCEPTION_NOT_HANDLED ◆错误分析:Windows内核检查到一个非法或者未知的进程指令, 这个停机码一般是由问题的内存或是与前面0x0000000A相似的原因造成的. ◇解决方案: (1)硬件兼容有问题:请对照前面提到的最新硬件兼容性列表, 查看所有硬件是否包含在该列表. (2)有问题的设备驱动、系统服务或内存冲突和断冲突: 如果在蓝屏信息出现了驱动程序的名字, 请试着在安装模式或者故障恢复控制台禁用或删除驱动程序, 并禁用所有刚安装的驱动和软件. 如果错误出现在系统启动过程, 请进入安全模式, 将蓝屏信息所标明的文件重命名或者删除. (3)如果错误信息明确指出Win32K.sys: 很有可能是第三方远程控制软件造成的, 需要从故障恢复控制台将对该软件的服务关闭. (4)在安装Windows后第一次重启时出现:最大嫌疑可能时系统分区的磁盘空间不足或BIOS兼容有问题. (5)如果是在关闭某个软件时出现的:很有可能时软件本省存在设计缺陷, 请升级或卸载它. 5、0x00000023:FAT_FILE_SYSTEM 0x00000024:NTFS_FILE_SYSTEM ◆错误分析:0x00000023通常发生在读写FAT16或者FAT32文件系统的系统分区时, 而 0x00000024则是由于NTFS.sys文件出现错误(这个驱动文件的作用是容许系统读写使用 NTFS文件系统的磁盘). 这两个蓝屏错误很有可能是磁盘本身存在物理损坏, 或是断要求封包(IRP)损坏而导致的. 其他原因还包括:硬盘磁盘碎片过多; 文件读写操作过于频繁, 并且数据量非常达或者是由于一些磁盘镜像软件或杀毒软件引起的. ◇解决方案: 第一步:首先打开命令行提示符, 运行"Chkdsk /r"(注:不是CHKDISK, 感觉象这个, 但是……)命令检查并修复硬盘错误, 如果报告存在怀道(Bad Track), 请使用硬盘厂商提供的检查工具进行检查和修复. 第二步:接着禁用所有即使扫描文件的软件, 比如:杀毒软件、防火墙或备份工具. 第三步:右击C:\winnt\system32\drivers\fastfat.sys文件并选择"属性", 查看其版本是否与当前系统所使用的Windows版本相符.(注:如果是XP, 应该是C:\windows\system32 \drivers\fastfat.sys) 第四步:安装最新的主板驱动程序, 特别IDE驱动. 如果你的光驱、可移动存储器也提供有驱动程序, 最好将它们升级至最新版. 6、0x00000027:RDR_FILE_SYSTEM ◆错误分析:这个错误产生的原因很难判断, 不过Windows内存管理出了问题很可能会导致这个停机码的出现. ◇解决方案:如果是内存管理的缘故, 通常增加内存会解决问题. 7、0x0000002EATA_BUS_ERROR ◆错误分析:系统内存存储器奇偶校验产生错误, 通常是因为有缺陷的内存(包括物理内存、二级缓存或者显卡显存)时设备驱动程序访问不存在的内存地址等原因引起的. 另外, 硬盘被病毒或者其他问题所损伤, 以出现这个停机码. ◇解决方案: (1)检查病毒 (2)使用"chkdsk /r"命令检查所有磁盘分区. (3)用Memtest86等内存测试软件检查内存. (4)检查硬件是否正确安装, 比如:是否牢固、金手指是否有污渍. 8、0x00000035:NO_MORE_IRP_STACK_LOCATIONS ◆错误分析:从字面上理解, 应该时驱动程序或某些软件出现堆栈问题. 其实这个故障的真正原因应该时驱动程序本省存在问题, 或是内存有质量问题. ◇解决方案:请使用前面介绍的常规解决方案与驱动程序和内存相关的方案进行排除. 9、0x0000003F:NO_MORE_SYSTEM_PTES ◆错误分析:一个与系统内存管理相关的错误, 比如:由于执行了大量的输入/输出操作, 造成内存管理出现问题: 有缺陷的驱动程序不正确地使用内存资源; 某个应用程序(比如:备份软件)被分配了大量的内核内存等. ◇解决方案:卸载所有最新安装的软件(特别是哪些增强磁盘性能的应用程序和杀毒软件)和驱动程序. 10、0x00000044:MULTIPLE_IRP_COMPLIETE_REQUESTS ◆错误分析:通常是由硬件驱动程序引起的. ◇解决方案:卸载最近安装的驱动程序. 这个故障很少出现, 目前已经知道的是, 在使用 www.in-system.com/这家公司的某些软件时会出现, 其的罪魁就是Falstaff.sys文件.(作者难道不怕吃官司嘛, 把公司网址公布) 11、0x00000050: PAGE_FAULT_IN_NONPAGED+AREA ◆错误分析:有问题的内存(包括屋里内存、二级缓存、显存)、不兼容的软件(主要是远程控制和杀毒软件)、损坏的NTFS卷以及有问题的硬件(比如: PCI插卡本身已损坏)等都会引发这个错误. ◇解决方案:请使用前面介绍的常规解决方案与内存、软件、硬件、硬盘等相关的方案进 行排除. 12、0x00000051:REGISTRY_ERROR ◆错误分析:这个停机码说明注册表或系统配置管理器出现错误, 由于硬盘本身有物理损坏或文件系统存在问题, 从而造成在读取注册文件时出现输入/输出错误. ◇解决方案:使用"chkdsk /r"检查并修复磁盘错误. 13、0x00000058:FTDISK_INTERNAL_ERROR ◆错误分析:说明在容错集的主驱动发生错误. ◇解决方案:首先尝试重启电脑看是否能解决问题, 如果不行, 则尝试"最后一次正确配置"进行解决. 14、0x0000005E:CRITICAL_SERVICE_FAILED ◆错误分析:某个非常重要的系统服务启动识别造成的. ◇解决方案:如果是在安装了某个新硬件后出新的, 可以先移除该硬件, 并通过网上列表检查它是否与Windows 2K/XP兼容, 接着启动电脑, 如果蓝屏还是出现, 请使用"最后一次正确配置"来启动Windows, 如果这样还是失败, 建议进行修复安装或是重装. 15、0x0000006F:SESSION3_INITIALIZATION-FAILED ◆错误分析:这个错误通常出现在Windows启动时, 一般是由有问题的驱动程序或损坏的系统文件引起的. ◇解决方案:建议使用Windows安装光盘对系统进行修复安装. 16、0x00000076ROCESS_HAS_LOCKED_PAGES ◆错误分析:通常是因为某个驱动程序在完成了一次输入/输出操作后, 没有正确释放所占有的内存 ◇解决方案: 第一步:点击开始-->运行:regedt32, 找到[HKLM\SYSTEM\Currentcontrol set\control\session manager\memory management], 在右侧新建双字节值"TrackLockedPages", 值为1. 这样Windows便会在错误再次出现时跟踪到是哪个驱动程序的问题.第二步:如果再次出现蓝屏, 那么错误信息会变成:STOP:0x0000000CB(0xY,0xY,0xY,0xY)DRIVER_LEFT_LOCKED_PAGES_IN_PROCESS其第四个"0xY"会显示为问题驱动程序的名字, 接着对其进行更新或删除.第三步:进入注册表, 删除添加的"TrackLockedPages". 17、0x00000077:KERNEL_STACK_INPAGE_ERROR ◆错误分析:说明需要使用的内核数据没有在虚拟内存或物理内存找到. 这个错误常常于是着磁盘有问题, 相应数据损坏或受到病毒侵蚀. ◇解决方案:使用杀毒软件扫描系统; 使用"chkdsk /r"命令检查并修复磁盘错误, 如不行则使用磁盘厂商提供的工具检查修复. 18、0x0000007A:KERNEL_DATA_INPAGE_ERROR ◆错误分析:这个错误往往是虚拟内存的内核数据无法读入内存造成的. 原因可能是虚拟内存页面文件存在坏簇、病毒、磁盘控制器出错、内存有问题. ◇解决方案:首先用升级为最新病毒库杀毒软件查杀病毒, 如果促无信息还0xC000009C 或0xC000016A代码, 那么表示是坏簇造成的, 并且系统的磁盘检测工具无法自动修复, 这时要进入"故障恢复控制台", 用"chkdsk /r"命令进行手动修复. 19、0x0000007B:INACESSIBLE_BOOT_DEVICE ◆错误分析:Windows在启动过程无法访问系统分区或启动卷. 一般发生在更换主板后第一次启动时, 主要是因为新主板和旧主板的IDE控制器使用了不同芯片组造成的. 有时也可能是病毒或硬盘损伤所引起的. ◇解决方案:一般只要用安装光盘启动电脑, 然后执行修复安装即可解决问题. 对于病毒则可使用DOS版的杀毒软件进行查杀(主战有kv2005DOS版下载). 如果是硬盘本身存在问题, 请将其安装到其他电脑, 然后使用"chkdsk /r"来检查并修复磁盘错误. 20、0x0000007E:SYSTEM_THREAD_EXCEPTION_NOT_HANDLED ◆错误分析:系统进程产生错误, 但Windows错误处理器无法捕获. 其产生原因很多, 包括:硬件兼容性、有问题的驱动程序或系统服务、 或者是某些软件. ◇解决方案:请使用"事件查看器"来获取更多的信息, 从发现错误根源.(发现好像不是解决哦, 看来这里大家要自力更生了!) 21、0x0000007F:UNEXPECTED_KERNEL_MOED_TRAP ◆错误分析:一般是由于有问题的硬件(比如:内存)或某些软件引起的. 有时超频也会产生这个错误. ◇解决方案:用检测软件(比如:Memtest86)检查内存, 如果进行了超频, 请取消超频. 将PCI硬件插卡从主板插槽拔下来, 或更换插槽. 另外, 有些主板(比如:nForce2主板)在进行超频后, 南桥芯片过热也会导致蓝屏, 此时为该芯片单独增加散热片往往可以有效解决问题. 22、0x00000080:NMI_HARDWARE_FAILURE ◆错误分析:通常是有硬件引起的.(似乎蓝屏与硬件错误有不解之缘) ◇解决方案:如果最近安装了新硬件, 请将其移除, 然后试试更换插槽和安装最新的驱动程序, 如果升级了驱动程序, 请恢复后原来的版本; 检查内存金手指是否有污染和损坏; 扫描病毒; 运行"chkdsk /r"检查并修复磁盘错误; 检查所有硬件插卡已经插牢. 如果以上尝试都无效果, 就得找专业的电脑维修公司请求帮助了. 23、0x0000008E:KERNEL_MODE_EXCEPTION_NOT_HANDLED ◆错误分析:内核级应用程序产生了错误, 但Windows错误处理器没有捕获. 通常是硬件兼容性错误. ◇解决方案:升级驱动程序或升级BIOS. 24、0x0000009C:MACHINE_CHECK_EXCEPTION ◆错误分析:通常是硬件引起的. 一般是因为超频或是硬件存在问题(内存、CPU、总线、电 源). ◇解决方案:如果进行了超频, 请降会CPU原来频率, 检查硬件. 25、0x0000009FRIVER_POWER_STATE_FAILURE ◆错误分析:往往与电源有关系, 常常发生在与电源相关的操作, 比如:关机、待机或休睡. ◇解决方案:重装系统, 如果不能解决, 请更换电源. 26、0x000000A5:ACPI_BIOS_ERROR ◆错误分析:通常是因为主板BIOS不能全面支持ACPI规范. ◇解决方案:如果没有相应BIOS升级, 那么可在安装Windows 2K/XP时, 当出现"press F6 if you need to install a third-party SCSI or RAID driver"提示时, 按下F7键, 这样Windows便会自动禁止安装ACPI HAL, 而安装 Standard PC HAL. 27、0x000000B4:VIDEO_DRIVER_INIT_FAILURE ◆错误分析:这个停止信息表示Windows因为不能启动显卡驱动, 从而无法进入图形界面. 通常是显卡的问题, 或者是存在与显卡的硬件冲突(比如:与并行或串行端口冲突). ◇解决方案:进入安全模式查看问题是否解决, 如果可以, 请升级最新的显卡驱动程序, 如果还不行, 则很可能是显卡与并行端口存在冲突, 需要在安全模式按下WIN+break组合键打开"系统属性", 在硬件-->设备管理器找到并双击连接打印的LPT1端口的项, 在"资源"选项卡取消"使用自动配置"的构选, 然后将"输入/输出范围"的"03BC"改为"0378". 28、0x000000BE:ATTEMPTED_WRITE_TO_READONLY_MEMORY ◆错误分析:某个驱动程序试图向只读内存写入数据造成的. 通常是在安装了新的驱动程序, 系统服务或升级了设备的固件程序后. ◇解决方案:如果在错误信息包含有驱动程序或者服务文件名称, 请根据这个信息将新安装的驱动程序或软件卸载或禁用. 29、0x000000C2:BAD_POOL_CALLER ◆错误分析:一个内核层的进程或驱动程序错误地试图进入内存操作. 通常是驱动程序或存在BUG的软件造成的. ◇解决方案:请参考前面介绍的常规解决方案相关项目进行排除. 30、0x000000CERIVER_UNLOADED_WITHOUT_CANCELLING_PENDING_OPERATIONS ◆错误分析:通常是由有问题的驱动程序或系统服务造成的. ◇解决方案:请参考前面介绍的常规解决方案相关项目进行排除. 31、0x000000D1RIVER_IRQL_NOT_LESS_OR_EQUAL ◆错误分析:通常是由有问题的驱动程序引起的(比如罗技鼠标的Logitech MouseWare 9.10和9.24版驱动程序会引发这个故障). 同时,有缺陷的内存、 损坏的虚拟内存文件、 某些软件(比如多媒体软件、杀毒软件、备份软件、DVD播放软件)等也会导致这个错误. ◇解决方案:检查最新安装或升级的驱动程序(如果蓝屏出现"acpi.sys"等类似文件名, 可以非常肯定时驱动程序问题)和软件; 测试内存是否存在问题; 进入"故障恢复控制台", 转到虚拟内存页面文件Pagefile.sys所在分区, 执行"del pagefile.sys"命令, 将页面文件删除; 然后在页面文件所在分区执行"chkdsk /r"命令;进入Windows后重新设置虚拟内存.如果在上网时遇到这个蓝屏, 而你恰恰又在进行大量的数据下载和上传(比如:网络游戏、BT下载), 那么应该是网卡驱动的问题, 需要升级其驱动程序. 32、0x000000EA:THREAD_STUCK_IN_DEVICE_DRIVER ◆错误分析:通常是由显卡或显卡驱动程序引发的. ◇解决方案:先升级最新的显卡驱动, 如果不行, 则需要更换显卡测试故障是否依然发生. 33、0x000000ED:UNMOUNTABLE_BOOT_VOLUME ◆错误分析:一般是由于磁盘存在错误导致的, 有时也建议检查硬盘连线是否接触不良, 或是没有使用合乎该硬盘传输规格的连接线, 例如ATA-100仍使用ATA-33的连接线, 对低速硬盘无所谓, 但告诉硬盘(支持ATA-66以上)的要求较严格, 规格不对的连线有时也会引起这类没办法开机的故障. 如果在修复后, 还是经常出现这个错误, 很可能是硬盘损坏的前兆. ◇解决方案:一般情况下, 重启会解决问题, 不管怎么样都建议执行"chkdsk /r"命令来检查修复硬盘 34、0x000000F2:HARDWARE)INTERRUPT_STORM ◆错误分析:内核层检查到系统出现断风暴, 比如:某个设备在完成操作后没有释放所占用 的断. 通常这是由缺陷的驱动程序造成的. ◇解决方案:升级或卸载最新安装的硬件驱动程序. 35、0x00000135:UNABLE_TO_LOCATE_DLL ◆错误分析:通常表示某个文件丢失或已经损坏, 或者是注册表出现错误. ◇解决方案:如果是文件丢失或损坏, 在蓝屏信息通常会显示相应的文件名, 你可以通过网络或是其他电脑找到相应的文件, 并将其复制到系统文件夹下的SYSTEM32子文件夹. 如果没有显示文件名, 那就很有可能是注册表损坏, 请利用系统还原或是以前的注册表备份进行恢复. 36、0x0000021A:STATUS_SYSTEM_PROCESS_TERMINATED ◆错误分析:用户模式子系统, 例如Winlogon或客服服务运行时子系统(CSRSS)已损坏, 所以无法再保证安全性, 导致系统无法启动. 有时, 当系统管理员错误地修改了用户帐号权限, 导致其无法访问系统文件和文件夹. ◇解决方案:使用"最后一次正确的配置", 如果无效, 可使用安装光盘进行修复安装. 37、STOP 0xC0000221 or STATUS_IMAGE_CHECKSUM_MISMATCH ◆错误分析:通常是由于驱动程序或系统DLL文件损坏造成的. 一般情况下, 在蓝屏会出现 文件名称 ◇解决方案: (1)使用Windows安装光盘进行修复安装; (2)如果还能进入安全模式, 可以"开始-->运行": sfc /scannow (3)还可以采用提取文件的方法来解决, 进入"故障恢复控制台", 使用copy或expand命令从光盘复制或解压受损的文件. 不过, 蓝屏一般都是驱动程序文件的问题, 所以expand命令会用的都一些, 比如:蓝屏提示tdi.sys文件, 因为驱动文件一般在i386\driver压缩包里, 所以使用: expand
“Python”这个英文单词的发音似“派森”,因此文可以称之为派森。Python是一个有10年历史的Windows编程语言。Python的创始人为Guido van Rossum。<br/><br/> <br/><br/>Python是一种即译式的,互动的,面向对象的编程语言,它包含了模组式的操作,异常处理,动态资料形态,十分高层次的动态资料结构,以及类别的使用。Python揉合了简单的语法和强大的功能。它的语法表达优美易读。它具有很多优秀的脚本语言的特点:解释的,面向对象的,内建的高级数据结构,支持模块和包,支持多种平台,可扩展。而且它还支持交互式方式运行,图形方式运行。它拥有众多的编程界面支持各种操作系统平台以及众多的各类函数库。利用C和C++可以对它进行扩充。个别的应用软件如果需要有一个可程序化界面也可以利用它来做为扩展语言用。最后,Python的可移植度非常高:它可以在许多的Unix类平台上运行,在Mac,MS-DOS,视窗Windows,Windows NT,OS/2,BeOS,以至RISCOS上都有相关的Python版本。<br/><br/> <br/><br/>Python核心网站是: http://www.python.org/ ,其你可以找到很多资料。如果您第一次使用 Python, 可以下载一个试试。目前,Python已经有成百上千的公共资源可以供你调用。 <br/><br/> <br/><br/>Python作用 <br/><br/> <br/><br/>Python可以用在许多场合。当你需要大量的动态调整,要容易使用,功能强大并且富有弹性的情况,Python可以发挥很好的功效。 <br/><br/> <br/><br/>一个宏编程语言 <br/><br/>你可以用Python给现有的应用程序添加一个宏语言或底稿编制(scripting)能力。经过稍微的训练,它使用户级别的底稿编制变得简单。发展一种新的语言常常被认为是大公司独家专利。Python是一个你可以加入你现有工具的宏语言并适合不同的层次的人使用。<br/><br/> <br/><br/>一个快速的对象模型和算法的原型开发工具 <br/><br/>开发软件花费钱财需要很多时间才能达到很好的效果。在Python下创建对象,你可以比我们知道的任何语言用更短的代码和更少的时间,并且全部支持继承,密封和多形性。一个比较流行的办法是在Python原型一个程序,直到你相信设计是正确的再换到C++,一个更好的办法是将Python应用程序轮廓化,然后在C++重写速度至关重要的部分。<br/><br/><br/><br/>一个调试工具 <br/><br/>新程序和代码库需要测试。有经验的开发人员知道给一个新功能或程序建立一个测试套件会节约时间并减少麻烦。如果一个程序可以与输入输出文件工作,Python 可以生成输入,运行这个程序,然后检查输出并进行分析。如果问题在于数据,你可以编写一次性的脚本来检查数据是否一致。<br/><br/> <br/><br/>数据清除和转换<br/><br/>你可能会将数据由一个数据库移到一个新的数据库,或新建一个界面让数据在互不兼容的系统流动。如果人工来做,这会是一个很繁琐而且容易犯错误的过程,你总会遗漏东西,到头来你还得重做以前的工作。Python对列表和字典的本地支持使复杂的数据转换更加容易。而且这种交互式模式可以让编程人员在转换过程的每一阶段观看数据。还可以编写由源到目标的数据转换的脚本并按需要不断运行,直到它正确完成工作。<br/><br/> <br/><br/>Python作为粘合剂 <br/><br/>互不兼容的系统常常需要被联在一起,而且这个过程需要自动进行。Python支持所有的集成关键技术。同时也很好的与文件,协议,DLLs及COM对象工作。Python还提供广泛的库帮助你得到几乎任何种类的数据。它还是很好的控制其他套件、进行系统管理以及控制其他系统数据流动的工具。<br/><br/> <br/><br/>运行方式<br/><br/> <br/><br/>Python可以以命令行方式运行,也可以交互式方式运行,还具有图形集成环境,这样开发Python就相当方便。现在已经出现了许多用Python编写的可视化编程软件,用于实现象Delphi一样的功能。<br/><br/> <br/><br/>面向对象<br/><br/> <br/><br/>Python是一个真正的面向对象语言。它甚至支持异常的处理。如果学过Java,应该对这个不陌生。但其它的脚本语言,如PHP,好象就没有。这使得程序的编写更加清晰,而不需要许多的错误检查了。<br/><br/> <br/><br/>模块和包<br/><br/> <br/><br/>这一点更象是Java。对于Java的支持,大家可以了解JPython。JPython是用Java写的Python,它完全支持Java,在这个环境下使用Python可以随意地使用Java的类库。语言扩展可以用C、C++或Java为Python编写新的新言模块,如函数。或者与Python直接编译在一起,或者采用动态库装入方式实现。也专门有人编写了一个工具,可以实现为Python自动实现函数接口封装,这就是SWIG(Simplified Wrapper and Interface Generator),或称做简单封装和接口生成器(可以在http://sourceforge.net/projects/swig/)。<br/><br/> <br/><br/>有趣的语法 <br/><br/> <br/><br/>Guido认为Python的语法是非常优美的。其一点就是,块语句的表示不是C语言常用的{}对,或其它符号对,而是采用缩近表示法!有趣吧。就这一点来说,Guido的解释是:首先,使用缩近表示法减少了视觉上的混乱,并且使程序变短,这样就减少了需要对基本代码单元注意的范围;其次,它减少了程序员的自由度,更有利于统一风格,使得阅读别人的程序更容易。感觉还是不错的,就C语言来说,在if语句后面大括号的写法就好几种,不同的人喜欢不同的样子,还不如统一起来,都不会看得别扭。 <br/><br/>在每个类或函数的定义后面,第一行可以是说明语句,根本不需要注释符标记。对于后面跟块语句的语句,后面应跟上一个冒号。一行语句不能太长,因为没有行结束符,如果超长则要使用续行符(\)。还有一些有趣的比如说,象下面的一个比较处理,用C语言为: <br/><br/> <br/><br/>if (2<br/><br/>用Python可以表示为<br/><br/>if (2 <br/><br/> <br/><br/>什么是Zope? <br/><br/> <br/><br/>Zope是一个开放源代码的Web应用服务器,采用Python语言开发,使用它您可以方便的构建内容管理、内部网、门户网站、和其他的定制应用。<br/><br/> <br/><br/> 高度面向对象的Web开发平台,采用Python语言开发。<br/><br/> 可以运行在几乎所有流行的操作系统上,支持多语言。<br/><br/> 能集成到其他流行的服务器,也自带服务器。<br/><br/> 提供清晰的数据/逻辑/表示的分离。<br/><br/> 带有可扩展的内置对象和强大的集成安全模块。<br/><br/> <br/><br/> 什么是Plone?<br/><br/> <br/><br/>Pone是一个Zope上的一个用户友好、功能强大的开放源代码内容管理系统。Plone适合用作内部网/外部网的服务器、文档发布系统、门户服务器和异地协同群件工具,到目前,Plone其实已经发展成为了一个应用开发平台。<br/><br/> <br/><br/> 是一种功能强大的开放源码(Open Source)内容管理系统(CMS)。<br/><br/> 通过Web浏览器来访问、编辑内容和管理,易于更新内容。<br/><br/> 无需编程,即可创建新的内容类型。<br/><br/> 协同的编辑和发布机制。<br/><br/> <br/><br/>Python的IDE开发环境: <br/><br/> <br/><br/>Wingide:http:// www.wingide.com<br/><br/>ipython: http://ipython.scipy.org/ <br/><br/>
<> page begin==================== 目 目目 目 录 录录 录 第一部分 C#语言概述.4 第一章 第一章第一章 第一章 .NET 编 编 编程语言 程语言编程语言 程语言 C#.4 1.1 Microsoft.NET——一场新的革命.4 1.2 .NET 与 C#.6 1.3 C#语言的特点.8 1.4 小 结 .11 第二章 运行环境 全面了解.NET.12 2.1 .NET 结构.12 2.2 公用语言运行时环境与公用语言规范.13 2.3 开 发 工 具 .17 2.4 小 结 .19 第三章 编写第一个应用程序 .20 3.1 Welcome 程序 .20 3.2 代 码 分 析 .20 3.3 运 行 程 序 .23 .4 添 加 注 释 .25 3.5 小 结 .27 第二部分 C#程序设计基础.28 第四章 数 据 类 型 .28 4.1 值 类 型 .28 4.2 引 用 类 型 .33 4.3 装箱和拆箱 .39 4.4 小 结 .42 第五章 变量和常量 .44 5.1 变 量 .44 5.2 常 量 .46 5.3 小 结 .47 第六章 类 型 转 换 .48 6.1 隐式类型转换 .48 6.2 显式类型转换 .53 6.3 小 结 .56 第七章 表 达 式 .58 7.1 操 作 符 .58 7.2 算术操作符和算术表达式.59 7.3 赋值操作符和赋值表达式.64 7.4 关系操作符和关系表达式.65 <> page begin==================== 7.5 逻辑操作符和逻辑表达式.68 7.6 位 运 算 .69 7.7 其它特殊操作符 .72 7.8 小 结 .77 第八章 流 程 控 制 .79 8.1 条 件 语 句 .79 8.2 循 环 语 句 .86 8.3 条 件 编 译.90 8.4 异常处理语句 .95 8.5 小 结 .100 第三部分 面向对象的 C#.101 第九章 面向对象的程序设计 .101 9.1 面向对象的基本概念.101 9.2 对象的模型技术 .103 9.3 面向对象的分析 .105 9.4 面向对象的设计 .107 9.5 小 结 .110 第十章 类 .112 10.1 类 的 声 明 .112 10.2 类 的 成 员 .113 10.3 构造函数和析构函数 .119 10.4 小 结 .122 第十一章 方 法 .124 11.1 方法的声明.124 11.2 方法的参数.125 11.3 静态和非静态的方法.129 11.4 方法的重载.130 11.5 操作符重载.134 11.6 小 结.137 第十二章 域 和 属 性 .139 12.1 域 .139 12.2 属 性 .143 12.3 小 结 .146 第十三章 事件和索引指示器 .148 13.1 事 件 .148 13.2 索引指示器 .151 13.3 小 结 .154 第十四章 继 承 .155 14.1 C#的继承机制.155 <> page begin==================== 14.2 多 态 性 .159 14.3 抽象与密封 .163 14.4 继承关于属性的一些问题.169 14.5 小 结 .172 第四部分 深入了解 C#.174 第十五章 接 口 .174 15.1 组件编程技术 .174 15.2 接 口 定 义 .177 15.3 接口的成员 .178 15.4 接口的实现 .182 15.5 抽象类与接口 .195 15.6 小 结 .196 第十六章 组织应用程序 .198 16.1 基 本 概 念 .198 16.2 使用名字空间 .200 16.3 使用指示符 .203 16.4 程 序 示 例 .206 16.5 小 结 .213 第十七章 文 件 操 作 .215 17.1 .Net 框架结构提供的 I/O 方式 .215 17.2 文件存储管理 .217 17.3 读 写 文 件 .222 17.4 异步文件操作 .227 17.5 小 结 .234 第十八章 高 级 话 题 .235 18.1 注册表编程 .235 18.2 在 C #代码调用 C++和 VB 编写的组件 .240 18.3 版 本 控 制 .249 18.4 代 码 优 化 .252 18.5 小 结 .254 第五部分 附 录 .255 附录 A 关 键 字.255 附录 B 错 误 码.256 附录 C .Net 名字空间成员速查.269 参 考 资 料 .300 <> page begin==================== 第一部分 C#语言概述 第一章 第一章第一章 第一章 .NET 编程语 编程编程 编程 言 语言语言 语言 C# 未来 未来未来 未来 5 年 年年 年 我们的目标就 我们的目标就我们的目标就 我们的目标就是超 是是 是 越今天各自为营的 超越今天各自为营的超越今天各自为营的 超越今天各自为营的 Web 站点 站点站点 站点 把 把把 把 Internet 建成一 建成建成 建成 个 一个一 一个可 可个可 可 以互相交换组件的地方 以互相交换组件的地方以互相交换组件的地方 以互相交换组件的地方 比尔 比尔比尔 比尔.盖茨 盖茨盖茨 盖茨 在本章你将了解 Microsoft.NET 的概念 .NET 框架 C#语言在.NET 框架的作用及其特性 1.1 Microsoft.NET 一场新的革命 1.1.1 什么是.NET 2000 年 6 月 22 日 不论对 Microsoft 还是对整个 IT 业界都将成为值得纪念的一天 这一天 微软公司正式推出了其下一代计算计划 Microsoft.NET(以下简称.NET) 这项计划将使微软现有的软件在 Web 时代不仅适用于传统的 PC 而且也能够满足目前 呈强劲增长势头的新设备 诸如蜂窝电话以及个人数字助理 Personal Digital Assistant, PDA 等的需要 微软还计划通过创建新的工具来吸引软件开发人员和合作伙伴对 Microsoft.NET 的认同 并且开发出其他基于 Internet 的服务 那么 你是否想知道 究竟什么是.NET? 请听听微软官员的声音 因特网的革命 从微软的角度来讲 我们就是要 建设一个平台来创建并且支持新一代的应用 我们必须有一套通用系统服务来支 持这样的操作 这种观点就说明 我们还有下一个层次的发展 也就是说因特网下一 步的发展 它将使因特网的作用远远超越展现一个网站 .NET 首先是一个开发平台 它定义了一种公用语言子集 Common Language Subset CLS ,这是一种为符合其规范的语言与类库之间提供无缝集成的混合语 .NET 统一了编程类库 提供了对下一代网络通信标准 可扩展标记语言 Extensible Markup <> page begin==================== Language XML 的完全支持 使应用程序的开发变得更容易 更简单 Microsoft.NET 计划还将实现人机交互方面的革命 微软将在其软件添加手写和语音识别的功能 让人们能够与计算机进行更好的交流 并在此基础上继续扩展功能 增加对各种用户 终端的支持能力 最为重要的 .NET 将改变因特网的行为方式 软件将变成为服务 与 Microsoft 的其它产品一样 .NET 与 Windows 平台紧密集成 并且与其它微软产品 相比它更进一步 由于其运行库已经与操作系统融合在了一起 从广义上把它称为一 个运行库也不为过 简而言之 .NET 是一种面向网络 支持各种用户终端的开发平台环境 微软的宏 伟目标是让 Microsoft.NET 彻底改变软件的开发方式 发行方式 使用方式等等 并且 不止是针对微软一家 而是面向所有开发商与运营商 .NET 的核心内容之一就是要搭 建第三代因特网平台 这个网络平台将解决网站之间的协同合作问题 从而最大限度 地获取信息 在 .NET 平台上 不同网站之间通过相关的协定联系在一起 网站之间 形成自动交流 协同工作 提供最全面的服务 1.1.2 我们为什么需要.NET 某一天 你出差到外地 在机场租借手机电话 在向该终端插入自己的 IC 卡后 自己的地址簿和计划簿被自动下载 随即它就变成了你个人专用的 PDA 这不是梦境 这是.NET 为我们描绘的一个未来生活的场景 人们的需要总是无法满足 我们不断地问自己 我们还应该有些什么 需求推 动着技术的进步 在二十一世纪 Internet 将成为商业活动的主要场所 B2B B2C 等 电子商务的运作方式 一对一营销的经营概念将网络的服务功能提高到了前所未有的 程度 微软公司在此时提出.NET 有其深远的战略考虑 改革商务模型 微软公司感觉到只靠销售软件包的商务模型没有什么前途 该公 司打算今后将心转移到可以在网络上使用“服务”型商务 这样 首要的问题就是解 决网络上用来开发并执行“服务”的平台 这就是 Microsoft.NET 提高软件开发生产效率 并且试图使应用软件的发布更为容易 再也不想因为 DLL 版本不同而烦恼 希望不用重新启动电脑就能够安装应用软件 改进用户界面 并能支持多种用户终端 用户界面演进的结果包括两方面的内容 一是完成传统的 PC 界面与基于 XML 的浏览器界面间的过渡 二是对自然语言和语音 识别的支持 从而使用户与各种终端之间的沟通更加透明 真正达到网络互连的 3A Anywhere Anytime Any device 今天 许多的人时常问 除了上网看新闻 我们究竟还能干什么 这是因为今 天的互联网与旧式的大型计算机的工作模式还有许多相似之处 信息被储存在央服 务器内 而用户的所有操作都要依靠它们 让不同的网址之间相互传递有意义的信息 或者合作提供更广泛和更深层次的服务 还是一件十分困难的事 现代人时常有一种困惑 感觉到如今生活在技术与机器架构的丛林 我们在努 力地去适应机器 适应技术 而不是机器和技术适应人类 科技以人为本还只是一个 美好的愿望 这是因为我们还不能将控制信息的权利交给那些需要信息的人们 .NET <> page begin==================== 的出现 意味着人们可以只用一种简单的界面就可以编写 浏览 编辑和分享信息 而且还可以得到功能强大的信息管理工具 由于使用的所有的文件都以符合网络协议 的格式存在 所以所有的商业用户和个人用户都可以方便地查找和使用其的信息 任何规模的公司都可以使用相同的工具与他们的供应商 商业伙伴和客户高效地沟通 和分享信息 这样就创造出一种全新的协同工作模式 总之 .NET 战略是一场软件革命 .NET 对最终用户来说非常重要 因为计算机的功能将会得到大幅度提升 同 时计算机操作也会变得非常简单 特别地 用户将完全摆脱人为的硬件束缚 用户可 以自由冲浪于因特网的多维时空 自由访问 自由查看 自由使用自己的数据 而不 是束缚在便携式电脑的方寸空间——可通过任何桌面系统 任何便携式电脑 任何移 动电话或 PDA 进行访问 并可对其进行跨应用程序的集成 .NET 对开发人员来说也十分重要 因为它不但会改变开发人员开发应用程序 的方式 而且使得开发人员能创建出全新的各种应用程序 大幅提高软件生产率 .NET 将保证完全消除当今计算技术的所有缺陷 .NET 定能实现确保用户从任何地点 任 何设备都可访问其个人数据和应用程序的宏伟蓝图 .NET 把雇员 客户和商务应用程序整和成一个协调的 能进行智能交互的整 体 而各公司无疑将是这场效率和生产力革命的最大受益者 .NET 承诺为人类创造一 个消除任何鸿沟的商务世界 1.1.3 .NET 的核心组件 .NET 的核心组件包括 一组用于创建互联网操作系统的构建块 其包括 Passport.NET 用于用户认 证 以及用于文件存储的服务 用户首选项管理 日历管理以及众多的其它任务 构建和管理新一代服务的基本结构和工具 包括 Visual Studio.NET .NET 企 业服务器 .Net Framework 和 Windows.NET 能够启用新型智能互联网设备的.NET 设备软件 .NET 用户体验 1.2 .NET 与 C# 1.2.1 支持多种编程语言的.NET 结构框架 让我们翻开教科书 回顾一下近十年来软件开发的历史 多年以前 当微软的组件对象模型 Component Object Model, COM 尚未推出时 软件的复用性对于开发人员仅仅是一种美好的憧憬 成千上万的程序员为了处理通信 接口和不同语言间的冲突而通宵达旦地艰辛劳动 但却收效甚微 COM 的出现改变了 <> page begin==================== 这一切 通过将组件改变为通用 集成型的构件 开发人员正逐渐地从过去的繁复编 程事务解脱出来 可以选择自己最得心应手的编程语言进行编程 然而 软件组件 与应用程序之间的联合仍然是松散的 不同的编程语言与开发平台限制了部件间的互 用性 其结果是产生了日益庞大的应用程序与不断升级的软硬件系统 举个很简单的 例子 只用五行 C 语言代码就能编写出的一个简单程序 若使用 COM 来编写 结果 会是令人吃惊的 我们需要几百行代码 COM 在带来巨大价值的同时 也大大增加了 开发开销 而.NET Framework 的出现使得一切问题都迎刃而解 实际上 在.NET Framework 所有的编程语言 从相对简单的 JScript 到复杂的 C++语言 一律是等 同的 Framework 框架 是开发人员对编程语言命令集的称呼 .Net 框架的意义就在 于只用统一的命令集支持任何的编程语言 正如微软 Web 服务心的成组产品经理 John Montgomery 所说 只需简单地一用 .NET 框架便可消除各种异类框架之间的差异 将它们合并为一个整体 .NET 的作用不仅仅是将开发人员从必须掌握多种框架的束缚 解脱出来 通过创建跨编程语言的公共 API 集 .NET 框架可提供强大的跨语言继承 性 错误处理和调试功能 现在 开发人员可以自由地选择他们喜欢的编程语言 .NET 平台欢迎所有人的垂顾 ”.NET 将使编程人员梦想的语言互用性变成为近在眼前的现 实 想想看 一个在 Visual Basic VB 定义的类能够在另一种与它完全不同的语言 环境使用 调试 甚至继承 这是多么令人兴奋的事情 .NET 框架是.NET 平台的基础架构 其强大功能来自于公共语言运行时 Common Language Runtime,CLR 将在第二章进行详细的解释 环境和类库 CLR 和类库 包 括 Windows Forms ADO.NET 和 ASP.NET 紧密结合在一起 提供了不同系统之间 交叉与综合的解决方案和服务 .NET 框架创造了一个完全可操控的 安全的和特性丰 富的应用执行环境 这不但使得应用程序的开发与发布更加简单 并且成就了众多种 类语言间的无缝集成 1.2.2 面向.Net 的全新开发工具 C# 在最近的一段时间里 C 和 C++一直是最有生命力的程序设计语言 这两种语言 为程序员提供了丰富的功能 高度的灵活性和强大的底层控制能力 而这一切都不得 不在效率上作出不同程度的牺牲 如果你使用过包括 C 和 C++在内的多种程序设计语 言 相信你会深刻体会到它们之间的区别 比如与 Visual Basic 相比 Visual C++程序 员为实现同样的功能就要花费更长的开发周期 由于 C 和 C++即为我们带来了高度的 灵活性 又使我们必须要忍受学习的艰苦和开发的长期性 许多 C 和 C++程序员一直 在寻求一种新的语言 以图在开发能力和效率之间取得更好的平衡 今天 人们改进 开发出了许多语言以提高软件生产率 但这些或多或少都以牺 牲 C 和 C++程序员所需要的灵活性为代价 这样的解决方案在程序员身上套上了太多 的枷锁 限制了他们能力的发挥 它们不能很好地与原有的系统兼容 更为令人头痛 的是 它们并不总是与当前的 Web 应用结合得很好 理想的解决方案 是将快速的应用开发与对底层平台所有功能的访问紧密结合在 <> page begin==================== 一起 程序员们需要一种环境 它与 Web 标准完全同步 并且具备与现存应用间方便 地进行集成的能力 除此之外 程序员们喜欢它允许自己在需要时使用底层代码 针对该问题 微软的解决方案是一种称之为 C#的程序语言 C#是一种现代的面向 对象的程序开发语言 它使得程序员能够在新的微软.NET 平台上快速开发种类丰富的 应用程序 .NET 平台提供了大量的工具和服务 能够最大限度地发掘和使用计算及通 信能力 由于其一流的面向对象的设计 从构建组件形式的高层商业对象到构造系统级应 用程序 你都会发现 C#将是最合适的选择 使用 C#语言设计的组件能够用于 Web 服务 这样通过 Internet 可以被运行于任何操作系统上任何编程语言所调用 不但如此 C#还能为 C++程序员提供快捷的开发方式 又没有丢掉 C 和 C++的基 本特征 强大的控制能力 C#与 C 和 C++有着很大程度上的相似性 熟悉 C 和 C++ 的开发人员很快就能精通 C# 1.3 C#语言的特点 C#在带来对应用程序的快速开发能力的同时 并没有牺牲 C 与 C++程序员所关心 的各种特性 它忠实地继承了 C 和 C++的优点 如果你对 C 或 C++有所了解 你会发 现它是那样的熟悉 即使你是一位新手 C#也不会给你带来任何其它的麻烦 快速应 用程序开发 Rapid Application Development RAD 的思想与简洁的语法将会使你迅 速成为一名熟练的开发人员 正如前文所述 C#是专门为.NET 应用而开发出的语言 这从根本上保证了 C# 与.NET 框架的完美结合 在.NET 运行库的支持下 .NET 框架的各种优点在 C#表现 得淋漓尽致 让我们先来看看 C#的一些突出的特点 相信在以后的学习过程 你将 会深深体会到 # SHARP 的真正含义 简洁的语法 精心地面向对象设计 与 Web 的紧密结合 完整的安全性与错误处理 版本处理技术 灵活性与兼容性 1.3.1 简洁的语法 请原谅 虽然我们一再强调学习本书不需要任何的编程基础 但在这里还不得不 提到 C++ 在缺省的情况下 C#的代码在.NET 框架提供的 可操控 环境下运行 不允许直 接地内存操作 它所带来的最大特色是没有了指针 与此相关的 那些在 C++被疯 狂使用的操作符 例如 -> 和 ., 已经不再出现 C#只支持一个 . 对 <> page begin==================== 于我们来说 现在需要理解的一切仅仅是名字嵌套而已 C#用真正的关键字换掉了那些把活动模板库 Active Template Library ALT 和 COM 搞 得 乱 糟 糟 的 伪 关 键 字 , 如 OLE_COLOR BOOL VARIANT_BOOL DISPID_XXXXX 等等 每种 C#类型在.NET 类库都有了新名字 语法的冗余是 C++的常见的问题 比如 const”和 #define 各种各样的字 符类型等等 C#对此进行了简化 只保留了常见的形式 而别的冗余形式从它的语法 结构被清除了出去 1.3.2 精心地面向对象设计 也许你会说 从 Smaltalk 开始 面向对象的话题就始终缠绕着任何一种现代程序 设计语言 的确 C#具有面向对象的语言所应有的一切特性 封装 继承与多态 这 并不出奇 然而 通过精心地面向对象设计 从高级商业对象到系统级应用 C#是建 造广泛组件的绝对选择 在 C#的类型系统 每种类型都可以看作一个对象 C#提供了一个叫做装箱 boxing 与拆箱 unboxing 的机制来完成这种操作 而不给使用者带来麻烦 这在 以后的章节将进行更为详细的介绍 C#只允许单继承 即一个类不会有多个基类 从而避免了类型定义的混乱 在后 面的学习你很快会发现 C#没有了全局函数 没有了全局变量 也没有了全局常 数 一切的一切 都必须封装在一个类之 你的代码将具有更好的可读性 并且减 少了发生命名冲突的可能 整个 C#的类模型是建立在.NET 虚拟对象系统 Visual Object System VOS 的基 础之上 其对象模型是.NET 基础架构的一部分 而不再是其本身的组成成分 在下面 将会谈到 这样做的另一个好处是兼容性 借助于从 VB 得来的丰富的 RAD 经验 C#具备了良好的开发环境 结合自身强 大的面向对象功能 C#使得开发人员的生产效率得到极大的提高 对于公司而言 软 件开发周期的缩短将能使它们更好地应付网络经济的竞争 在功能与效率的杠杆上人 们终于找到了支点 1.3.3 与 Web 的紧密结合 .NET 新的应用程序开发模型意味着越来越多的解决方案需要与 Web 标准相统 一 例如超文本标记语言 Hypertext Markup Language HTML 和 XML 由于历史 的原因 现存的一些开发工具不能与 Web 紧密地结合 SOAP 的使用使得 C#克服了这 一缺陷 大规模深层次的分布式开发从此成为可能 由于有了 Web 服务框架的帮助 对程序员来说 网络服务看起来就像是 C#的本地 对象 程序员们能够利用他们已有的面向对象的知识与技巧开发 Web 服务 仅需要使 用简单的 C#语言结构 C#组件将能够方便地为 Web 服务 并允许它们通过 Internet 被 运行在任何操作系统上的任何语言所调用 举个例子 XML 已经成为网络数据结构 传送的标准 为了提高效率 C#允许直接将 XML 数据映射成为结构 这样就可以有 <> page begin==================== 效地处理各种数据 1.3.4 完全的安全性与错误处理 语言的安全性与错误处理能力 是衡量一种语言是否优秀的重要依据 任何人都 会犯错误 即使是最熟练的程序员也不例外 忘记变量的初始化 对不属于自己管理 范围的内存空间进行修改 这些错误常常产生难以预见的后果 一旦这样的软 件被投入使用 寻找与改正这些简单错误的代价将会是让人无法承受的 C#的先进设 计思想可以消除软件开发的许多常见错误 并提供了包括类型安全在内的完整的安 全性能 为了减少开发的错误 C#会帮助开发者通过更少的代码完成相同的功能 这不但减轻了编程人员的工作量 同时更有效地避免了错误发生 .NET 运行库提供了代码访问安全特性 它允许管理员和用户根据代码的 ID 来配 置安全等级 在缺省情况下 从 Internet 和 Intranet 下载的代码都不允许访问任何本地 文件和资源 比方说 一个在网络上的共享目录运行的程序 如果它要访问本地的 一些资源 那么异常将被触发 它将会无情地被异常扔出去 若拷贝到本地硬盘上运 行则一切正常 内存管理的垃圾收集机制减轻了开发人员对内存管理的负担 .NET 平台提供的垃圾收集器 Garbage Colection GC 将负责资源的释放与对象撤销时的 内存清理工作 变量是类型安全的 C#不能使用未初始化的变量 对象的成员变量由编译器负 责将其置为零 当局部变量未经初始化而被使用时 编译器将做出提醒 C#不支持不 安全的指向 不能将整数指向引用类型 例如对象 当进行下行指向时 C#将自动验 证指向的有效性 C#提供了边界检查与溢出检查功能 1.3.5 版本处理技术 C#提供内置的版本支持来减少开发费用 使用 C#将会使开发人员更加轻易地开发 和维护各种商业应用 升级软件系统的组件 模块 是一件容易产生错误的工作 在代码修改过程 可能对现存的软件产生影响 很有可能导致程序的崩溃 为了帮助开发人员处理这些 问题 C#在语言内置了版本控制功能 例如 函数重载必须被显式地声明 而不会 像在 C++或 Java 经常发生的那样不经意地被进行 这可以防止代码级错误和保留版 本化的特性 另一个相关的特性是接口和接口继承的支持 这些特性可以保证复杂的 软件可以被方便地开发和升级 1.3.6 灵活性和兼容性 在简化语法的同时 C#并没有失去灵活性 尽管它不是一种无限制的语言 比如 它不能用来开发硬件驱动程序 在默认的状态下没有指针等等 但是 在学习过程 你将发现 它仍然是那样的灵巧 如果需要 C#允许你将某些类或者类的某些方法声明为非安全的 这样一来 你 <> page begin==================== 将能够使用指针 结构和静态数组 并且调用这些非安全的代码不会带来任何其它的 问题 此外 它还提供了一个另外的东西 这样的称呼多少有些不敬 来模拟指针的 功能 delegates 代表 再举一个例子 C#不支持类的多继承 但是通过对接口的 继承 你将获得这一功能 下面谈谈兼容性 正是由于其灵活性 C#允许与 C 风格的需要传递指针型参数的 API 进行交互操作 DLL 的任何入口点都可以在程序进行访问 C#遵守.NET 公用语言规范 Common Language Specification CLS 从而保证了 C#组件与其它语言组件间的互操作性 元 数据 Metadata 概念的引入既保证了兼容性 又实现了类型安全 1.4 小 结 Microsoft.NET 计划将彻底改变我们对因特网的认识 从而在这样一个网络时代彻 底改变我们的生活 软件是一种服务 技术是我们的仆人 时间与地点将不再是我们 面前的障碍 建立在 CLR 与类库基础上的.NET 框架是.NET 平台的核心组件之一 这 为软件的可移植性与可扩展能力奠定了坚实的基础 并为 C#语言的应用创造了良好的 环境 C#是.NET 平台的通用开发工具 它能够建造所有的.NET 应用 其固有的特性保 证了它是一种高效 安全 灵活的现代程序设计语言 从最普通的应用到大规模的商 业开发 C#与.NET 平台的结合将为你提供完整的解决方案 在本章 我们提出了与.NET 以及与 C#语言相关的一些概念 例如 CLR VOS 和 GC 也许你是初次接触它们 但不用担心 在以后的各章我们将详细地介绍这些 相关的概念与知识 相信通过学习 你将能够迅速掌握它们 并熟练地运用它们提供 的各种特性 复习题 1 什么是.NET 2 简要说明.NET 战略的意义 3 .NET 的核心组件包括哪些 4 C#与其它语言相比有哪些突出特点 <> page begin==================== 第二章 运行环境 全面了解.NET C#运行在.NET 平台之上 其各种特性与.NET 密切联系 它没有自己的运行库 许多强大的功能均来自.NET 平台的支持 因此 要想真正掌握 C#首先必须了解.NET 本章将向你介绍 C#的运行环境 重点放在.NET 公用语言运行时环境与公用语言规范 上 最后介绍了.NET 的开发工具 2.1 .NET 结构 .NET 包括四个组成部分 VOS 类型系统 元数据 公用语言规范 虚拟执行系统 下面分别对它们进行简要介绍 2.1.1 虚拟对象系统 .NET 跨语言集成的特性来自于虚拟对象系统 VOS 的支持 在不同语言间进行代码复用和应用集成所遇到的最大问题 是不同语言类型系 统间的相容性问题 可以想象 不同的语言虽然语法结构大体相同 但数据类型与语 言环境本身的各种特点联系紧密 很难想象一种解释性的语言所拥有的数据类型会与 一种编译语言相同 而即使相同的数据类型在不同的语言环境表示的意义也存在差 别 例如 同样是整数类型 在 MSSQL 的长度是 32 位 而在 VB 却是 16 位 至 于日期时间与字符串类型在这方面的区别就更加明显了 VOS 的建立就是为了改变这种状况 它既支持过程性语言也支持面向对象的语言 同时提供了一个类型丰富的系统来容纳它所支持的各种语言的特性 它在最大程度上 屏蔽了不同语言类型系统间的转换 使程序员能够随心所欲地选择自己喜欢的语言 当 然 这种语言必须支持.NET 应用 从事开发 保证了不同语言间的集成 对于过程性语言 它描述了值的类型并指定了类型的所有值必须遵守的规则 在 面向对象的语言方面 它统一了不同编程语言的对象模型 每一个对象在 VOS 都被 唯一标识以与其它对象相区别 <> page begin==================== 2.1.2 元数据 元数据是对 VOS 类型描述代码的一种称呼 在编译程序将源代码转换成为间 代码时 它将自动生成 并与编译后的源代码共同包含在二进制代码文件 元数据 携带了源代码类型信息的描述 这在一定程度上解决了版本问题 程序使用的类型 描述与其自身绑定在一起 在 CLR 定位与装载类型时 系统通过读取并解析元数据来获得应用程序的类型 信息 JIT 编译器获得加载的类型信息后 将间语言代码翻译成为本地代码 在此基 础上根据程序或用户要求建立类型的实例 由于整个过程 CLR 始终根据元数据建 立并管理对应特定应用程序的类型 从而保证了类型安全性 此外 元数据在解决方法的调用 建立运行期上下文界限等方面都有着自己的作 用 而关于元数据的一切都由.NET 在后台完成 2.1.3 公用语言规范 公用语言规范 Common Language Specification CLS 是 CLR 定义的语言特性 集合 主要用来解决互操作问题 如果一个类库遵守 CLS 那么同样遵守 CLS 规范的 其它编程语言将能够使用它的外部可见项 详细的内容见本章第二节 2.1.4 虚拟执行系统 虚拟执行系统 Visual Execution System VES 是 VOS 的实现 它用来驱动运行 环境 元数据的生成与使用 公用语言规范的满足性检查以及应用程序执行过程的 内存管理均由它来完成 具体说来 VES 主要完成以下功能 装入间代码 使用 JIT 将间代码转换为本地码 装入元数据 代码管理服务 包括垃圾收集器和异常处理 定制与调试服务 线程和环境管理 2.2 公用语言运行时环境与公用语言规范 了解了.NET 的结构之后 我们该看看.NET 利用其结构为我们创造的运行环境 公用语言运行时环境 它是 C#及其它支持.NET 平台的开发工具的运行基础 具体 来说 它为我们的应用提供了以下益处 跨语言集成的能力 跨语言异常处理 内存管理自动化 <> page begin==================== 强化的安全措施 版本处理技术 组件交互的简化模型 2.2.1 理解 CLR .NET 提供了一个运行时环境 叫做公用语言运行时 它管理着代码的执行 并使 得开发过程变得更加简单 这是一种可操控的执行环境 其功能通过编译器与其它工 具共同展现 你的代码将受益于这一环境 依靠一种以运行时为目标的 指完全支持 运行时环境的 编译器所开发的代码叫做可操控代码 它得益于可操控环境的各种特 性 跨语言集成 跨语言异常处理 增强的安全性 版本处理与开发支持 简单的组 件交互模型以及调试服务 为了使运行时环境能够向可操控代码提供服务 语言编译 器需要产生一种元数据 它将提供在你使用语言的类型 成员 引用的信息 元数 据与代码一起存储 每个可加载的 CLR 映像均包含了元数据 运行时环境使用元数据 定位并载入类 在内存展开对象实例 解决方法调用 产生本地代码 强制执行安 全性 并建立运行时环境的边界 运行时环境自动处理对象的展开与引用 当它们不再使用时负责它们的释放 被 运行时环境进行这样的生命期管理的对象被称为可操控代码 自动内存管理消除了内 存溢出 同时也解决了其它一些常见的语法错误 如果你的代码是可操控的 你仍然 可以在需要的时候使用非可控代码 或者在你的.NET 应用同时使用可控与非可控代 码 由于语言编译器支持他们自己的类型 比如一些原始类型 你可能并不总是知道 也不必知道 你的数据是否是可控的 CLR 使设计跨语言的组件与应用变得更加容易 以不同语言设计的对象能够彼此 间进行通信 并且它们的行为能够紧密地综合与协调 举个例子 你定义了一个类 然后可以在另一种不同的语言从该类派生了一个类或者调用它其的一个方法 你也可以向另一种语言类的方法传递该类的一个实例 这种跨语言的集成之所以可 能 因为以运行时间为目标的语言编译器与工具使用一种运行时间所定义的公用类型 系统 他们遵守运行时的规则 公用语言规范 来定义新的类型 生成 使用 保持 并绑定类型 作为元数据的一部分 所有可控组件携带了关于它们所依赖的组件与资源的信息 运行时环境使用这些信息来保证你的组件或应用具有需要的所有东西的特定版本 其 结果是你的代码将不会因为版本冲突而崩溃 注册信息与状态数据不再保存在难以建 立与维护的注册表 你所定义的类型及附属信息作为元数据被保存 这使得复制与 移动组件的复杂程度得到降低 编译工具用他们自己的方式向开发人员展现 CLR 的功能 这意味着运行时间的一 些特性可能在不同的语言的表现形式将会有所不同 你怎样体验运行时的特性将取 决于你所使用的语言 比如说 如果你是一位 VB 开发人员 你可能注意到在运行时 环境的帮助下 VB 语言比以前具有更多的面向对象的特性 <> page begin==================== 2.2.2 可操控执行的含义 前面的叙述 我们多次提到了 可操控 这一概念 这意味着它指向的对象在 执行过程完全被运行时环境所控制 在执行过程 运行时环境提供以下服务 自 动内存管理 调试支持 增强的安全性及与非可操控代码的互操作性 例如 COM 组件 在可控执行进程的第一步是选择源代码的生成工具 如果你希望你的应用拥有 CLR 提供的优势 你必须使用一种 或多种 以运行时为目标的语言编译器 例如 VB C# VC 的编译器 或者一种第三方编译器如 PERL 或 COBOL 编译器 由于运行时是一种多语言执行环境 它支持众多的数据类型和语言特性 你使用 的语言编译器决定你将使用运行时的哪一部分功能子集 在代码使用的语法由你的 编译器决定 而不是运行时环境 如果你的组件需要被其他语言的组件完全使用 那 么你必须在你组件的输出类型使用 CLR 所要求的语言特征 当你完成并编译你的代码时 编译器将它转换为微软间语言 Microsoft Intermediate Language MSIL 同时产生元数据 当你要执行你的代码时 这种间 语言被即时 Just In Time JIT 编译器编译成为本地代码 如果安全策略需要的代码 是类型安全的 通常情况下都是如此 JIT 编译器将在编译进程间语言进行 类型检查 一旦失败 在代码执行将会触发异常 2.2.3 CLR 的突出特色 跨语言集成的能力 CLR 包含了一个丰富的语言特性集 保证了它与各种程序设计语言的兼容性 这 一特性集即公用语言规范 稍后将对其进行详细说明 内存管理自动化 在执行过程管理应用程序的资源是一项单调而困难的工作 它会将你的注意力 从你本应解决的问题引开 而垃圾收集机制完全解决了程序员在编程过程头痛的 问题 跟踪内存的使用 并知道何时将它们释放 在面向对象的环境 每种类型都标识了对你的应用有用的某种资源 为了使用 这些资源 你需要为类型分配内存 在应用 访问一种资源要通过以下步骤 1 为类型分配内存 2 初始化内存 设置资源的初始状态并使其可用 3 通过访问该类型的实例成员来访问资源 4 卸下将被清除的资源状态 5 释放内存 这一看似简单的过程在实际的编程是产生程序错误的主要来源之一 更可怕的 是 内存的错误往往导致不可预见的结果 如果你有过编程的经验 想想看 有多 少次你的程序因为内存访问错误而崩溃 CLR 要求所有的资源从可操控的堆 注 在此指一种内存结构 分配 当一个 <> page begin==================== 进程被初始化后 CLR 保留了一个未被分配的地址空间 这一区域叫做可操控堆 在 堆保持了指向下一个将被分配给对象的堆地址的指针 NEXT 初始状态下 该指 针是保留地址空间的基地址 一个应用使用新的操作产生对象 此操作首先检查新对 象需要字节的大小是否会超出保留空间 如果对象大小合适 指向下一个地址的指针 将指向堆的这个对象 该对象的构造器被调用 新的操作返回对象的地址 当一个应用请求建立一个对象时 地址空间可能不够大 堆将发现这一点 通过 将新对象的大小与 NEXT 指针相加 并与堆的大小进行比较 这时垃圾收集器就将被 调用 在这里 CLR 引入了 代 的概念 代 指堆对象产生的先后 这样 垃圾 收集器在将发生溢出时回收属于特定的 代 的对象 而不是回收堆的所有对象 6 即时编译 在各种语言的编译器对源代码进行编译之后 在 CLR 环境产生的是间代码 出 于兼容性与跨语言集成的考虑 其内容虽然有效 但在转化为本地代码之前它本身是 不可执行的 这就是 JIT 编译器需要完成的工作 这里需要说明一个问题 为什么要即时编译 而不是一次性的将间代码文件进 行编译 答案很简单 原因在于效率 在大型的应用 你很少会用到程序的全部功 能 这种边执行边编译的措施比一次性的完全编译效率更高 在 Windows 平台 CLR 带有三个不同的 JIT 编译器 7 缺省的编译器 主编译器 由它进行数据流分析并输出经过优化的本地代 码 所有的间代码指令均可被它处理 8 PREJIT 它建立在主 JIT 编译器之上 其运行方式更像一个传统的编译器 每当一个.NET 组件被安装时它就运行 9 ECONOJIT 在并不充分优化的前提下 它能够快速完成 IL 代码到本地码的 转换 编译速度与运行速度都很快 为了配合编译器的工作 在.NET SDK 的安装路径下的/bin 目录有一个负责管理 JIT 的应用程序 jitman.exe 具体的使用参见联机帮助 10 解决版本与发布问题 在当前以组件为基础的系统 开发人员和用户对于软件版本和发布存在的问 题已经十分熟悉了 当我们安装一个新的应用之后 我们很可能发现原本正常的某个 应用程序奇怪地停止了工作 绝大多数开发人员将时间花在了确保所有注册表入口的 一致性 以便激活 COM 类上 这就是所谓的 DLL 地狱 .NET 平台通过使用集合来解决这一问题 在这里 集合 是一个专有名词 指 类型与资源的发布单元 在很大程度上它等同于今天的 DLL 正像.NET 用元数据描述 类型一样 它也用元数据描述包含类型的集合 通常说来 集合由四个部分组成 集 合的元数据 集合的内部清单 元数据描述的类型 实现类型的间语言代码和一组 资源 在一个集合 以上四个部分并不是都必须存在 但是 集合必须包含类型 或资源 这样集合才有意义 在.NET 一个基本的设计方针是使用孤立的组件 一个孤立的集合的含义是指一 个集合只能被一个应用所访问 在一台机器上 它不被多个应用共享 也不会受其它 应用程序对系统的更改的影响 孤立 赋予了开发人员在自己的程序对代码的完全 <> page begin==================== 控制权 任何共享代码都需要被明确地标识 同时 .NET 框架也支持共享集合的概念 一个共享集合指在一台机器上被多个应用共享的集合 共享集合需要严格地命名规定 有了.NET 应用程序间的共享代码是明确定义的 共享集合需要一些额外的规则来避 免我们今天遇到的共享冲突问题 共享代码必须有一个全局唯一的名称 系统必须提 供名称保护 并在每当引用共享集合时 CLR 将对版本信息进行检查 此外.NET 框架 允许应用或管理员在明确说明的版本政策下重写集合的版本信息 2.2.4 公用语言规范 使被不同语言的编译器所编译的对象能够相互理解的唯一方法 是所有在互操作 过程涉及的数据类型和语言特性对所有的语言来说是公共的 为了这个目的 公用 运行时环境标识了一组语言特征的集合 称为公用语言规范 CLS 如果你的组件在 应用程序接口 Application Program Interface 仅使用 CLS 的特征语言 包括子类 那么该组件能够被任何支持CLS的语言所编译的组件访问 所有支持CLS并仅使用CLS 的语言特征的组件被称为符合 CLS 的组件 设计公用语言规范时遇到的一个最主要的挑战是选择适当的语言特性子集的大 小 它应具有完全的表达能力 又应足够小 使得所有的语言能够容纳它 由于 CLS 是关于语言互用性的规范 它的规则仅应用于外部可见的条目 CLS 假设语言间的 互操作性仅在语言集合的边界发生交叉时才是重要的 也就是说 在单一的语言集 对于编程技术的使用没有任何限制 CLS 的规则仅作用于在定义它们的语言集合之外 仍然可见的项上 这样就大大缩小了 CLS 的范围 减轻了系统的负担 在 CLS 是用 System.CLSCompliantAtribute 类来标识一个集合或者类是否是符合 CLS 规范的 在 System.CLSCompliantAtribute 的构造器有一个 Boolean 型的返回值 代表了与之相关联的项是否符合 CLS 规范 2.3 开 发 工 具 .NET 为使用与开发人员提供了功能强大 种类丰富的管理与开发工具 同时它们 也是.NET 框架提供的服务 我们将它们列在下面 正是由于有了它们的支持.NET 才 变得如此强大 1. Visual Studio.NET 是.NET 的核心开发工具 包括微软提供的各种开发语言 其有 Visual C# 2. Assembly Generation Utility (al.exe) 用来建立集合的工具 它能够将资源文件 或 MSIL 格式的文件转换为带有内容清单的集合 3. Windows Forms ActiveX Control Importer (aximp.exe) 完成 COM 类库类型定 义的转换 使 ActiveX 控件能够在 Windows 窗口控件上使用 4. Code Access Security Policy Utility (caspol.exe) 在用户与机器水平上修改安全策 略 <> page begin==================== 5. Software Publisher Certificate Test Utility (Cert2spc.exe) 用于从 X.509 证书生 成软件出版证明书 SPC 6. Certificate Manager Utility (certmgr.exe) 管理证书 证书信任列表和证书回收列 表 7. Certificate Verification Utility (chktrust.exe) 检查证书签名的合法性 8. Runtime Debugger (cordbg.exe) 运行时调试器 是一个命令行程序 帮助开发 人员发现和调试基于 CLR 的应用程序的错误 9. Global Assembly Cache Utility (gacutil.exe) 允许你浏览与操纵全局集合缓存 内容的命令行程序 10. MSIL Assembler (ilasm.exe) MSIL 汇编程序 协助设计与实现 MSIL 生成器的 程序 11. MSIL Disassembler (ildasm.exe) MSIL 反汇编程序 与 ilasm.exe 共同使用 将 由 MSIL 代码产生的 Portable Executable 文件转换为文本文件 12. Instaler Utility (instalutil.exe) 用来安装与卸载服务资源 13. License Compiler (lc.exe) 产生可包含在可执行二进制文件的二进制资源文 件 14. Certificate Creation Utility (makecert.exe) 生成 X.509 证书与用于数字签名的公 用与私有密钥 15. Permissions View Utility(permview.exe) 通过一个集合浏览许可集的工具 16. Peverify Utility(peverify.exe) 检查间语言与元数据是否符合类型安全认证要 求 17. Assembly Registration Tool(RegAsm.exe) 读取集合的元数据并加上必要注册 表入口信息 使得 COM 客户透明地建立 CLR 的类 18. Services Registration Tool (RegSvcs.exe) 服务注册工具 它完成执行以下功能 装载与注册一个集合 为现有的 COM+1.0 应用生成 注册与安装类库 19. Resource File Generator Utility(ResGen.exe) 资源文件生成器 用来将文本文件 和 XML 格式的资源文件转换为 CLR 的二进制文件 20. Secutil Utility(SecUtil.exe) 使得从集合抽取的安全信息更加容易 21. Set Registry Utility(setreg.exe) 改变注册表公开密钥密码系统的设置 22. Assembly Cache Viewer(shfusion.dl) 允许你使用 Windows 浏览器察看与操作 全局集合缓存的内容 23. File Signing Utility(signcode.exe) 为 PE (portable executable)文件做标记 赋予 程序员在组件安全约束的基础上对安全性有更多的控制权 24. Shared Name Utility(Sn.exe) 帮助程序员以共享名称建立集合 25. Soapsuds Utility(SoapSuds.exe) 使用远程技术帮助你编译与 Web 服务相通信的 客户应用 26. Isolated Storage Utility(storeadm.exe) 一种用来管理隔离存储区的命令行工具 27. Type Library Exporter(TlbExp.exe) 命令行程序 生成由集合名称指示的包含集 合公共类型定义的类库 <> page begin==================== 28. Type Library Importer (TlbImp.exe) 将 COM 类库的类型定义转换为在 CLR 与元数据格式一致的类型定义 29. Web Service Utility(WebServiceUtil.exe) 帮助建立 ASP.NET Web 服务与客户 30. Windows Forms Class Viewer(wincv.exe) 能够在某种查找模式下快速查找类或 者类序列的信息 31. Windows Forms Designer Test Container(windes.exe) 允许开发人员测试开发出 的视窗窗体控件在设计时的行为 32. XML Schema Definition Tool(xsd.exe) XML 计划定义工具 2.4 小 结 本章解释了与.NET 有关的概念并简要介绍了一些相关的技术 在了解了.NET 的 结构之后 我们重点讨论了公用语言运行时环境和公用语言规范 最后给出了.NET 开 发工具的清单 在完成本章的学习之后 你已经了解了有关 C#运行环境的相关知识 这将为你深 入学习 C#打下良好的基础 从下一章开始 我们将进入实际的编程实践 您将会发 现关于 C#的更多更有趣的东西 复习题 1 .NET 的结构由哪四部分组成 2 请简要总结 CLR 的作用 3 可操控执行 的含义是什么 4 .NET 是怎样解决传统 Windows 程序设计 DLL 的版本问题的 5 什么是 CLS 它的范围是怎样确定的 <> page begin==================== 第三章 编写第一个应用程序 介绍了 C#语言的这么多优点 您可能已经有些不耐烦了 好 那就让我们开始 C# 的开发之路吧 本章介绍如何生成您的第一个 C#程序 这是一个最基本的 C#应用程序 程序 的代码在全书将经常出现 我一直坚信 只有不断练习才是最好的学习方式 所以建议读者从本章开始 对 书所提供的程序示例 亲自进行编辑 编译和运行 在这个过程 您将获得开发 C#程序的有益经验 3.1 Welcome 程序 可以这么说 与用户没有任何交互的应用程序根本没有任何用处 病毒和黑客当 然除外 然而即使是病毒程序的作者 也常常喜欢在自己得逞之后炫耀一番 学习任 何一门语言 绝大多数情况下人们都是从输入输出开始的 第一个程序总是非常简单的 我们让用户通过键盘输入自己的名字 然后程序在 屏幕上打印一条欢迎信息 程序的代码是这样的 程 程序 序清 清单单 3-1 using System; class Welcome { static void Main() { Console.WriteLine("Please enter your name:"); Console.ReadLine(); Console.WriteLine("Welcome to you!"); } } 您可以在任意一种编辑软件完成上述代码的编写 然后把文件存盘 文件名叫 做 Welcome.cs 典型的 C#源文件通常都是以 .cs 作为文件的扩展名 3.2 代 码 分 析 首先要提出的是 C#语言是大小写敏感的 这一点对于 C 和 C++程序员没什么问 <> page begin==================== 题 只是要提醒一下 VB 和 Delphi 的程序员 接下来让我为您逐条地分析上面的 C#程序语句 3.2.1 名字空间 using System 表示导入名字空间 高级语言总是依赖于许多系统预定义的元素 如果 您是 C 或 C++的程序员 那么您一定对使用#include 之类的语句来导入其它 C 或 C++ 源文件再熟悉不过了 C#含义与此类似 用于导入预定义的元素 这样在自己的 程序就可以自由地使用这些元素 如果没有导入名字空间的话 我们该怎么办呢 程序还能保持正确吗 答案是肯 定的 那样的话 我们就必须把代码改写成下面的样子 程 程序 序清 清单 单 3-2 class Welcome { static void Main() { System.Console.WriteLine("Please enter your name:"); System.Console.ReadLine(); System.Console.WriteLine("Welcome to you!"); } } 也就是说 在每个 Console 前加上一个前缀 System. 这个小原点 . 表示 Console 是作为 System 的成员而存在的 C#抛弃了 C 和 C++繁杂且极易出错的操作符像 : 和 -> 等 C#的复合名字一律通过 . 来连接 System 是.Net 平台框架提供的最基本的名字空间之一 有关名字空间的详细使用 方法我们将放在第十七章详细介绍 在这里 只要我们学会怎样导入名字空间就足 够了 3.2.2 类和类的方法 让我们从写第一个程序时就记住 每个东西都必须属于一个类 如果您是 C 或 C++ 的程序员 请暂时忘掉那些全局变量 在程序的第二行 class Welcome 声明了一个类 类的名字叫做 Welcome 这个程 序为我们所作的事情就是依靠它来完成的 和 C C++一样 源代码块被包含在一对大括号 { 和 } 每一个右括号 } 总是和它前面离它最近的一个左括号 { 相配套 如果左括号 { 和右括号 } 没有全部配套 那程序就是一个错误的程序 static void Main()表示类 Welcome 的一个方法 方法总是为我们完成某件工作的 注意 在 C#程序 程序的执行总是从 Main()方法开始的 一个程序不允许出 <> page begin==================== 现两个或两个以上的 Main()方法 对于习惯了写 C 控制台程序的读者 请牢记 C# Main()方法必须被包含在一个类 3.2.3 程序的输入和输出 程序所完成的输入输出功能都是通过 Console 来完成的 Console 究竟是什么呢 它是在名字空间 System 已经为我们定义好的一个类 这里我们不用管它是怎么完成 工作的 只要使用它就可以了 上面的代码 类 Console 为我们展现了两个最基本的方法 WriteLine 和 ReadLine Console.ReadLine 表示接受输入设备输入 Console. WriteLine 则用于在输出设备上输 出 我们再为读者介绍 Console 用于输入输出的另两个方法 Read 和 Write 它们和 ReadLine 与 WriteLine 的不同之处在于 ReadLine 和 WriteLine 执行时相当在显示时多 加了一个回车键 而使用 Read 和 Write 时则光标不会自动转移到下一行 让我们再对例子程序进行扩展 使得用户的输入对输出产生作用 程 程序序清 清单 单 3-3 using System; class Welcome { static void Main() { Console.WriteLine("Please enter your name:"); string name = Console.ReadLine(); Console.WriteLine("Welcome to you,{0}!",name); } } 我们用到了 string name = Console.ReadLine()这条语句 其 string name 表示声明一 个字符串类型的变量 name 系统定义的 Console 类提供的方法 ReadLine()的返回值类型 为 string 所以 这句话表示从输入设备读取一个字符串 并把读取的值赋予变量 name 再来看一下程序的最后一条输出语句 Console.WriteLine("Welcome to you,{0}!",name); 这条语句表示在屏幕上对输出的字符串进行格式化 其表示用方法的第二个参 数来替代格式化后字符串相应的位置 对字符串进行格式化的参数可以是一个字符串 也可以是一个字符 或者是一个整数 等等 采用这种方式最多可以格式化三个变量 比如 int x = 3; string name1 = “Mike”; <> page begin==================== string name2 = “John”; Console.WriteLine("Welcome to you {0} times,{1} and {2}!",x,name1,name2); 和绝大多数编程语言一样 C#提供了字符串类型 string 它与 C 的 MFC 为我们 提供的类十分类似 C#的 string 类型是一个引用类型 引用类型在第四章我们有 详细说明 为标准字符集 利用 string 可以方便地对字符串进行连接 截断等操作 比如 string s = “Good” + “Morning”; char x = s[3]; 例子演示了字符串 s 由两个字符串 Good 和 Morning 相加得到 字符串还可 以通过下标进行索引 得到一个字符 上面的例子字符 x 的值为 o 所以 源程序 3-4 和源程序 3-3 的作用没什么区别 程 程序 序清 清单 单 3-4 using System; class Welcome { static void Main() { Console.WriteLine("Please enter your name:"); string message = “Welcome to you “ + Console.ReadLine(); Console.WriteLine(mesage); } } 3.3 运 行 程 序 理解了源程序每条代码的具体含义之后 下一步要做的就是让这个程序真正能 够运行 不过对源代码即使还有不明白的地方也没有关系 在后续章节的学习 您 最终会熟练掌握这些概念的 如果您的电脑上安装了 Visual Studio .Net 则可以在集成开发环境 Integrated Developer Environment IDE 直接选择快捷键或菜单命令 编译并执行源文件 如果您不具备这个条件 那么您至少需要安装 Microsoft .Net Framework SDK 这 样才能够不妨碍您在本书继续学习 C#语言 实际上 .Net 平台内置了 C#的编译器 下面让我们使用这个微软提供的命令行编译器对我们的程序进行编译 启动一个命令行提示符 在屏幕上输入一行命令 csc welcome.cs <> page begin==================== 我们假设您已经将 welcome.cs 文件保存在当前目录下 如果一切正常 welcome.cs 文件将被编译 运行 屏幕上出现一行字符 提示您输入姓名 Please enter your name: 输入任意个字符并按下回车键 屏幕将打印出欢迎信息 Welcome to you! 注意 和到目前为止我们使用过的绝大多数编译器不同 在 C# 编译器只执行 编译这个过程 而在 C 和 C++要经过编译和链接两个阶段 换而言之 C#源文件并不 被编译为目标文件 .obj 而是直接生成可执行文件 .exe 或动态链接库 .dll C#编译器不需要包含链接器 编译选项 我们可以灵活地使用 .Net 平台提供的命令行编译器的不同选项 选择不同的编译 方式 从而灵活地对编译进行控制 例如 如果我们希望对源文件 Welcome.cs 进行编译 生成名为 MyWelcome.exe 的 可执行文件 我们可以采用这样的命令 csc/out: MyWelcome.exe Welcome.cs 如果我们并不需要一个可执行文件 而仅仅是希望简单地检查源文件是否存在 语法错误 则命令可以写成 csc/nooutput: Welcome.cs 如果不知道各个选项的具体含义 可以通过求助来获得 csc/? 为方便读者 我们在表 3-1 按字母排序的顺序列出了命令行编译器 csc 常用的参 数及其用途 更详细的信息请参阅 C#联机帮助文档 表 3-1 命令行编译器选项 选项 作用 @ 指定响应文件 /? 列出编译命令选项 /addmodule 指定一个或多个模块作为装配的一部分 /baseaddress 指定载入动态链接库的首选地址 /bugreport 生成一个报告文件 其包含程序 Bug 的详细信息 /checked 指定算术运算的溢出是否会导致程序在运行时抛出一个异常 /codepage 指定编译的所有源文件所使用的代码页 /debug 给出调试信息 /define 定义预处理程序的符号 /doc 由文件注释生成 XML 文件 /fulpaths 指定输出的绝对路径 /help 列出编译命令选项 /incremental 允许对源文件进行递增式编译 /linkresource 在装配时链接指定的 NET 资源 <> page begin==================== /main 指定 Main 方法所处的位置 /nologo 编译过程不显示编译信息 /nooutput 编译源文件但不输出 /nostdlib 不导入标准库 (mscorlib.dl). 续表 选项 作用 /nowarn 编译过程不生成警告信息 /optimize 指定编译时是否进行优化 /out 指定输出文件 /recurse 搜索子目录以寻找源文件 /reference 从包含装配的文件导入元数据 /resource 把 NET 资源内嵌到输出文件 /target 指定输出文件的格式 /target:exe 输出文件为 exe 可执行文件 /target:library 输出文件为链接库 /target:module 输出文件为模块 /target:winexe 输出文件为 winexe 可执行文件 /unsafe 允许编译使用了不安全关键字的代码 /warn 设置警告级别 /warnaserror 把警告信息作为错误看待 /win32icon 把 .ico 图标文件插入到输出文件 /win32res 把 Win32 资源插入到输出文件 .4 添 加 注 释 应用程序并不是只要你自己一个人能看懂就够了 不管以前计算机老师或者是编 程书籍是否已经告诫过 这里我还要再一次强调 养成良好的代码注释的习惯 这是 一名优秀的程序员必备的条件之一 代码注释不会浪费您的编程时间 它只会提高您 的编程效率 使您的程序更加清晰 完整 友好 注释的方式和 ++没有区别 每一行双斜杠 后面的内容 以及在 分割符 和 之间的内容都将被编译器忽略 这样 我们就可以采用 进行单行注释 采用分割符 和 进行多行注释 让我们对 Welcome 程序加上注释 程 程序序清 清单 单 3-5 源文件 welcome.cs / 说明 这里是我的第一个 程序 <> page begin==================== using System; class Welcome { static void Main() { Console.WriteLine("Please enter your name:"); 要求用户输入姓名 Console.ReadLine(); 读取用户输入 Console.WriteLine("Welcome to you!"); 本行代码用于打印欢迎信息 您可以在这里添加自己的代码 程序在这里结束 } } 上面的注释似乎有些小题大做 但它毕竟说明注释的使用方法 下面是对 程序进行注释时要注意的两个问题 首先 避免在 之后的单行注解使用反斜杠符号 \ 因为反斜杠符号 \ 在 是一个续行符 这样做往往会导致你所不希望的结果出现 例如 当你写了 类似于下面的代码 Console.WriteLine(“The result is:{0}” , / \ 150 ); 在编译这段代码时 表示逻辑上同一行剩余的所有文字被作为注释看待 而续行符 \ 则将这一行同下一行连接起来 那么第二行也被作为注释的一部分 这 时编译器找不到与第一行的左括号 相匹配的右括号 因此编译出错 其次 分割符 和 之间的注释不能有嵌套注释 这是因为 编译器从遇到第一个分割符 开始 将忽略下一个 直到遇上下一个与 之匹配的分割符 才认为注释结束 这样编译器就会对多余的 报告

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值