社区
VC.NET
帖子详情
COM是语言无关的.那么我可否用.net工具开发COM组建而用在VS6里面调用?
sanjiang
2001-09-25 09:31:17
比如VC6,VB6什么的,在没有安装.Net Framework的机器上运行.net工具开发的组建?
用VC7开发组建是否方便些?
...全文
98
5
打赏
收藏
微信扫一扫
点击复制链接
分享
下载分享明细
分享
举报
写回复
5 条
回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
sam1111
2001-10-09
可以,只要不调用.NET类就行了。
打赏
举报
回复
赞
dreambroken
2001-10-08
COM本质没变,不过可能会出现问题。
打赏
举报
回复
赞
meilideme
2001-10-01
当然是可以的
打赏
举报
回复
赞
wyzegg
2001-09-28
可以
打赏
举报
回复
赞
Ninputer
2001-09-28
在这一方面,两者没有差别
打赏
举报
回复
赞
相关推荐
如果你的
.
NET
调
用
Office套件有问题,不妨查查这个地方
用
.
NET
来使
用
office的一些功能进行
开发
是常
用
的,而一般遇到的问题是
在
开发
机上一切正常,而跑到其他机器上就运行不了了。此时一般会查是否安装好了对应的
.
NET
Framework,以及office有没有
在
目标机器上面安装,但是office安装的时候,是有一个选项“是否安装
.
NET
支持的”,有可能目标机器上面就没有选中,而造成程序的无法运行,此时可以检查下面这个目录,这里以PPT为例:c:\WI...
Visual C++
.
net
数据库
开发
经典案例解析
配套光盘使
用
说明 (1) 本光盘是《Visual C++
.
NET
数据库
开发
经典案例解析》的配套光盘,与图书一起发行,不得单独出售。 (2) 本光盘的主要内容包括各章示例程序的代码及数据库文件。光盘的说明文件为Readme.txt,即本文件。 (3) 示例程序是按照它们出现的章顺序编排的。 (4) 光盘上的示例程序都是
在
Microsoft Visual Studio
.
NET
2003和SQL Server 2000个人版下调试通过的,不同的版本可能存
在
差别。另外,使
用
的操作系统是Microsoft Windows 2000(Professional),原则上,操作系统对程序没有影响,不过,作者没有
在
其他操作系统平台上调试这些程序。
在
配套光盘上,作者提供了示例程序的源代码。另外需要注意的是,作者建议读者重新编译所有示例程序,进而熟悉它们的结构和基本功能。 (5) 要运行本光盘各章节“代码”目录下的程序,需要安装SQL Server 2000,并建立起相应数据库。各个实例的数据库文件存放
在
相应“建库脚本”目录下。有两种方法建立数据库:一是
在
SQL Server的企业管理器中右击“数据库”,
在
快捷菜单中选择【所有任务】|【附加数据库】命令,选择相应的数据库文件(扩展名为mdf),单击【确定】按钮就可以了;另一种方法是通过SQL Server的企业管理器的恢复数据库功能,从数据库备份文件恢复,备份文件的扩展名为bak。 (
6
) 如果安装了Microsoft Visual Studio
.
NET
2003,则不需要安装Microsoft
.
NET
Framework SDK v1.1,否则需要到http://msdn.microsoft.
com
/
net
framework/站点下载安装Microsoft
.
NET
Framework SDK v1.1
工具
,安装过程为标准的Windows安装。另外,请读者
在
运行各章程序前安装“运行程序所需文件”目录下的“报表Setup”程序。完成第(5)和第(
6
)步后,实例程序就可以正确运行了。 (7) 光盘的所有文件都被默认设置为只读文件,而所有程序
在
重新编译时都必须重新创建这些文件,所以
在
重新编译之前必须将所有文件属性修改为可写。 (8) 本光盘上所有程序都只供学习之
用
,未经作者许可,不得
用
于任何商业目的。 (9) 清华大学出版社几位编辑同志
在
本光盘的出版过程中付出了辛勤劳动,对本光盘的出版给予支持。
在
此对他们的工作表示感谢! (10) 由于时间仓促,光盘中示例程序出现错误
在
所难免。发现其中的问题后,如果方便,请您告知作者。另外,如果您要对本书内容的修改提出建议,也请您告知作者(email:docbak@sohu.
com
)。 谢谢使
用
本光盘! 作者 2005.10 清华园
WindowsMobile适
用
的命令行
工具
(附带WM命令清单),微软真小气,CMD也阉了,自己
用
.
net
cf 3.5弄一个更好
用
...
理应Windows Mobile
6
以上的机器都可以运行,需要
.
net
com
pact framework 3.5 以上的版本,WM
6
.5都自带了。实
在
没有可以去微软网站下。我的机器是三星i8000 WVGA 800*480是完美运行的哟,
在
模拟器下也试了更低的分辨率,也没问题。
开发
原因:i8000上三星/联通做了深度定制,很多WM原来的功能都被屏蔽了(但我要玩机呀),虽然网上有很多破解...
。
net
图书管理系统设计方案
《
.
net
程序设计》 大作业 学生姓名: 郝琛 学 号: 12 学 院: 电子与计算机科学技术学院 专 业: 网络工程 题 目: 图书管理系统 成 绩: 指导教师: 王素红 2010 年 11 月 22 日 1.设计目的 1.对图书资源进行分类,发布到网上,以供读者阅读。 2.为读者提供图书检索功能; 3.读者能方便地阅览电子图书; 4. 读者能方便地建立书签; 5. 读者能对书目进行评论;
6
. 对读者的
用
户名、密码及权限进行管理。 2.设计内容 (1)系统应符合图书馆信息管理的规定,满足图书馆日常管理的工作需要,并达到操作过程中的直观、方便、实
用
、安全等要求; (2)系统采
用
模块化程序设计方法,即便于系统功能的各种组合和修改,又便于未参与
开发
的技术维护人员补充、维护。 (3)系统应具备数据库维护功能,及时根据
用
户需求进行数据的添加,删除,修改等操作。 3.需求描述 整个软件生命周期中,
开发
所占的费
用
和时间都很小。后期维护工作一般要占整个软件生命周期的80% 以上。所以系统分析很重要,一个好的系统分析可以减少很多后期维护工作。 下面以一所学校的图书馆为例子进行分析,画出图书馆的组织结构图如下: 图1.1 图书馆的组织结构图 该图书馆各个部门负责的主要业务如下: (1)采编组主要负责图书采编工作,包括购置新书、打印编目、增加数量。 (2)目录厅主要负责读者查询工作,包括可借图书(按图书名称或关键字查询); (3)借阅组主要负责图书流通、查询统计、借阅查询等工作。 (4)阅览室、
工具
书室主要负责读者阅览工作,包括:阅览各种杂志、报纸、阅览各种
工具
书。 下面绘制出图书馆流通业务中借书的流程图: (1)读者
在
目录厅查阅索引卡; (2)读者写出所借图书的分类号、种次号、交给图书管理员,并出示本人的借书证; (3)图书管理员根据图书的分类号、种次号到书库找书; (4)将图书交给读者,并由读者填写所借图书的借书卡。 (5)图书管理员把借书卡保存到写有该读者借书证号的口袋里。 得出该图书馆业务流程图如下所示: 图1.2 图书馆业务流程图 4.系统详细分析设计 数据库设计是计算机管理信息系统中很重要的部分,设计质量的好坏、数据结构的优劣将直接影响到管理系统的成败。数据库设计的基本原则是
在
MIS总体信息方案的指导下,各个库应当为它所支持的管理目标服务,
在
设计数据库系统时,应当重点考虑以下几个因素: (1)数据库必须层次分明,布局合理。 (2)数据库必须高度结构化,保证数据的结构化、规范化和标准化。这是建立数据库和进行信息交换的基础。数据结构的设计应该遵循国家标准和行业标准,尤其是应重视编码的应
用
。 (3)
在
设计数据库时,一方面要尽可能的减少冗余度,减少存储空间的占
用
,降低数据的一致性问题发生的可能性;另一方面,还要考虑适当的冗余,以提高运行速度、降低
开发
难度。 (4)必须维护数据的正确性和一致性,
在
MIS中,多个
用
户共享数据库,由于并行
开发
操作,可能影响数据的一致性,因此必须
用
加锁等办法保证数据的一致性。 (5)设定相应的安全机制,由于数据库的信息对特定
用
户有特殊的保密要求,保密机制必不可少。 数据库需求分析 根据以上的需求分析和数据组织,开始设计数据结构,即根据需求勾画出实体/关系图(E/R)。
在
概念上,E/R图代表的是系统需要的数据及其这些数据之间的关系。如图所示的实体/关系图。 实体/关系图 从图中可以看出,
在
这个系统中实际存
在
的实体:图书和借阅人,其中借阅人和图书是多对多关系,针对本系统,通过对图书借阅管理的内容和数据流程分析,设计数据项和数据结构如下: (1)图书基本信息,其数据项有图书编号、图书名称、作者、出版社等。 (2)借阅人基本信息,其数据项有借阅人编号、借阅人姓名、电话等。 (3)图书借阅登记,其数据项有借阅序号、借阅图书编号、借阅人编号等。 为了实现图书信息录入的方便性与规范性以及相关的统计功能,还应增加出版社信息与图书分类信息。 (4)出版社信息,其数据项有出版社编号、出版社名称、地址、电话、传真等。 (5)图书分类信息,其数据项有分类编号、分类名称、同一类型图书数目。 同时针对于本系统的多
用
户使
用
特点,增加
用
户信息表: (
6
)管理员信息表,其数据项有
用
户名、密码。 为了实现图书借阅超期罚款制度,还应增设罚金规则表: (7)罚金规则表,其数据项包括免费使
用
天数、罚金费率、借阅数量。 数据库逻辑结构设计 数据库设计有几个范式,一般我们要做到的是第三范式,即数据表中没有冗余字段以及同一个表中的字段没有函数依赖关系,冗余字段即
在
一个表中已经保存过的信息,
在
另一个表中就不应该存
在
,如果需要的话,可以通过表间的关联来得到,函数依赖性就是一个表中的字段间不应该有计算关系,如一个表中有单价字段、数量字段,就不应该有一个总金额字段。如果程序运行过程中需要总金额,可以实时计算。不过
在
一些较常
用
的表中,我们可以适当地保留冗余字段,这样,
在
程序运行过程中可以减少由于表间互相关联而使
用
速度降低等问题。这就是所谓的第四范式。数据表设计时,最好不要使
用
用
户输入的信息作为主键,每一个数据表自己定义一个主键,添加信息是由程序自动添加,这样就可以减少数据更新时产生的错误。表与表相关联的外键最好是由程序自动生成的主键,这样数据库就比较规范了。 另外,数据表设计时一般都应该有一些标志字段,标志字段可以定义成INT或BIT型。建议实际应
用
中定义成INT字段可以存储多种可能的状态,
在
最初设计时,可能我们没有考虑到的一些情况,
在
程序后来的
开发
中,可以通过设计标志字段为不同的 值来解决,这样就避免了修改数据库结构。 数据库初期设计时一定要谨慎,把所有可能的情况都考虑进去,即使当时没有
用
到,也要将它留
在
数据库中作为备
用
字段以便将来扩充。 程序一旦开始编码,就应该尽量避免再修改数据库。因为如果数据库结构一旦改变,所有与修改的数据表相关的业务都有可能受到影响,而某些影响还很难看到,这样就容易形成一个恶性循环。错误越改越多,越改越乱,最终导致程序的失败。 (1)规划有效的索引 a.
在
组合表的列中创建索引,包括主关键字和外部关键字所
在
的列。 b.
在
列或类组合中创建唯一的索引能增强唯一性。 c.浏览索引并卸载不使
用
的索引。索引需要一定硬盘空间和时间来维护。具有较高数据插入操作频率的数据库最好不要索引。有较高读操作频率的数据库应该有更多的索引。 d.避免
在
簇索引中包括不必要的列。
在
可能的情况下,使
用
较小的数据类型,例如
用
varchar替代char。 e.考虑使
用
簇索引来支持排序和范围化查询。
在
为数据检索优化表时,簇索引必须支持数据的分组索引。为簇关键字选择列或列组,簇关键字以经常需要的顺序排序数据或以必须被一起访问的记录而分组记录。 f.创建支持一般查询的查找参数索引。具有高选择性的列是索引的最好候选列。具有高密度的列是索引糟糕的候选列。 (2)使
用
约束实现数据的完整性 PRIMARY KEY约束
在
表中定义了主关键字,它是行唯一的标识符,它可以强制实体完整性。
在
使
用
PRIMARY KEY约束时考虑以下事实: a. 每个表只能有一个PRIMARY KEY约束。 b. 键入的值必须是唯一的。 c. 不允许有空值。 d. PRIMARY KEY约束
在
指定的列创建唯一的索引,可以指定簇索引和非簇索引(如果非簇索引先前并不存
在
,簇索引是默认的)。 UNIQUE约束指定,
在
一列中的两行不能有相同的值。该约束使
用
唯一的索引来强制实体的完整性。
在
已有一个主关键字时UNIQUE约束很有
用
,例如雇员号,但是必须保证其他标识符(例如,雇员驾驶证号)也是唯一的。
在
使
用
UNIQUE约束时,考虑以下事实; a. 允许有空值。 b.
在
一个表中可以设置多个UNIQUE约束。 c. 可以将UNIQUE约束运
用
于具有唯一值的单列或多列,但不能
用
于表的主关键字。 d. 通过
在
指定的列或列组中创建唯一的索引,可以使UNIQUE索引得到强制 系统主要功能模块的创建 本系统是功能结构完整的图书管理系统,程序涉及的窗体和模块相对较多。
在
详细介绍各个窗体之前,首先把本系统的主要功能模块汇总如下: (1)
用
户登录模块设计(index_book.aspx)
用
户登录模块主要根据
用
户登录的信息,与数据库中信息成功匹配后,获得其相应的操作权限。
用
户也可以不进行登录,但只能浏览书籍的基本信息,不能进行借书等操作功能。 (2)
用
户信息模块设计(Regedit.aspx) 为了减轻图书管理员的工作压力,允许读者自己填写相关信息,管理员只要
在
后台对相关读者信息进行审核即可。 (3) 图书详细信息模块设计(Book_Info.aspx) 读者可以查看具体书籍的信息,包括这本书是否已经借出等相关信息,登录的
用
户还可以对未借出的书籍进行
在
线借阅。 (4)图书搜索模块(Book_class.aspx) 读者可以
在
左边菜单栏内对图书名称或关键字进行模糊查询,根据搜索结果会显示出相关信息,单击相应的名称还可以查看具体书籍的信息 (5)图书管理员后台登录模块(Book_admin/Login.aspx) 图书管理员可以登录此后台进行相关业务的管理,包括书籍的添加,读者信息审核,读者书籍归还等操作 (
6
)
用
户类别管理(Book_admin/Mem_Class.aspx) 对
用
户权限的设置,可以对不同
用
户进行分类,可以设置不同的属性 (7)书籍类别的管理(Book_admin/Book_Class.aspx) 对不同的图书进行分类,使
用
户更好的查找,也便于图书的维护。 (8)出版社信息管理(Book_admin/Pub_Class.aspx) 考虑到出版社的有限,也是为了能更好的维护出版社信息,作揖作为独立一个模块进行维护,能大量减少管理员的工作。 (9)注册
用
户管理(Book_admin/index.aspx) 对注册读者的信息进行审核,核实读者信息的正确性,管理员可以修改注册
用
户的信息及审核的一些状态。(只有通过审核的读者才能借阅书籍) (10)图书信息的管理(Book_admin/Manage_Book.aspx) 管理员可以添加,修改,删除书籍,并且可以时时进行维护 (11)图书归还管理(Book_admin/Borw_Book.aspx) 后台页面将显示
用
户还未归还书籍的相关信息,管理员也可以通过模糊或精确查询查询有关
用
户未还书的信息,可以查看具体借书的信息及超时,罚款等信息。 建立应
用
程序层次结构
在
介绍系统中各个主要功能实现模块之前,首先把本系统的整个层次结构归纳如下(为了制图方便有些功能模块已合并,这里只是简单的对整个系统有初步印象,使
用
户操作起来更方便)见图4-1所示: 图4.1 系统运行层次结构图 图书基本情况的录入、修改、删除等基本操作。 办理借书卡模块。 实现借书功能。 实现还书功能。 能方便的对图书进行查询。 对超期的情况能自动给出提示信息。 具有数据备份和数据恢复功能。 4.1
开发
工具
及系统运行环境
开发
工具
: MDAC,ASP
.
NET
,IIS 5.1,SQL Server 2000数据库,Microsoft Visual Studio 2008 运行环境:
在
开始进行ASP
.
NET
编程之前,要了解一下运行ASP
.
NET
的环境需求。首先需要安装Web服务器IIS,如果没有安装过MDAC,还要安装MDAC,最后安装ASP
.
NET
的运行环境
.
NET
Framework。 IIS是ASP
.
NET
惟一可以使
用
的Web服务器,所以,为了能够运行ASP
.
NET
,就一定要安装IIS。 (1) IIS的安装 如果使
用
的是Windows 2000操作系统,
那么
安装的IIS的版本是IIS 5.0;如果使
用
的是Windows XP操作系统,
那么
安装的IIS的版本是IIS 5.1。 IIS是随操作系统一起提供的,如果已经安装过了IIS,
那么
就可以
在
控制面板的管理
工具
中找到它(
在
英文的版本中,它的名字是Inter
net
Information Services;
在
中文的版本中,它的名字是Inter
net
服务管理器)。如果没有找到IIS,
那么
就需要安装。 首先打开控制面板,使
用
它的“增加/删除程序”功能,选择“添加/删除Windows组件”功能,显示“Windows组件向导”对话框,如图B-1所示。 图B-1 “Windows组件向导”对话框
在
此对话框的“组件”列表框中选中“Inter
net
信息服务”复选框,并单击“详细信息”按钮,选择需要安装的IIS子组件,如图B-2所示。
在
所有选择都完成之后,单击“确定”按钮开始安装。 图B-2 “Inter
net
信息服务”对话框 安装成功之后,只要启动Windows,IIS就会自动启动。IIS的大部分程序都安装
在
\winnt\system32\i
net
srv中,同时创建了一个\I
net
Pub目录
用
于存放Web网页文件。 (2) 使
用
IIS 由于IIS是
在
Windows启动的时候自动启动的,所以,如果没有特别设置,一旦进入Windows,IIS就是开启的状态。为了使
用
IIS,可以
在
控制面板的管理
工具
中找到Inter
net
服务管理器。它的管理界面如图B-3所示。 图B-3 IIS管理界面 为了测试现
在
IIS是否工作,可以
在
浏览器中输入“http://cindyking/ localstart.asp”、“http://127.0.0.1/localstart.asp”(这里127.0.0.1是本机默认的IP地址)或者“http://localhost/ localstart.asp”等URL,如果Windows 2000附带的一个测试页localstart.asp可以成功显示,
那么
表示IIS安装成功。 (3)目录管理 为了能够访问到IIS管理的页面,需要把编制好的页面和程序放置
在
一个目录中,这个目录对于IIS来说就是主目录。主目录中存放着HTTP请求所需要的资源。所以,
在
使
用
IIS之前还要做的一件事情就是设置主目录。
用
右击Inter
net
服务器管理程序中的默认Web站点,从弹出的快捷菜单中选择“属性”命令,显示图B-4所示的对话框。
在
“主目录”选项卡中可以看到,IIS允许有三种信息来源:此计算机上的目录、另一计算机的共享位置和重定向到URL。选择不同的选项,就可以
在
下面的文本框中输入相应的信息来获取相应的主目录。 图B-4 设置主目录 2.数据库安装 本系统采
用
的数据库是SQL Server 2000数据库,如本地机器没有安装SQL Server 2000数据库,请先安装SQL Server 2000数据库(SQL Server 2000试
用
软件请到“http://www.microsoft.
com
./china/sql/evaluation/trial/”下载),然后将本实例中的数据库附加到企业管理器中。附加数据库的具体方法如下: (1).单击“开始”菜单,
在
“所有程序”目录下选择“Microsoft SQL Server/企业管理器”选项,打开SQL Server 2000中的“企业管理器”,然后展开本地服务器,
在
“数据库”数据项上单击鼠标右键,
在
弹出的快捷菜单中,选择“所有任务”/“附加数据库”菜选项,如图B-5所示。 图B-5
在
企业管理器中附加数据库 (2).将弹出“附加数据库”对话框,如图B-
6
所示,单击“要附加数据库的MDF文件”文本框后的【…】按钮,弹出“浏览现有文件对话框”,
在
浏览现有文件对话框中选择数据库文件POS.MDF,如图B-
6
所示。 图B-
6
附加数据库 (3).单击【确定】按钮,将弹出“附加数据库顺利完成”提示对话框,单击【确定】按钮,即可完成数据库的附加操作。 注意:登录SQL Server 2000的
用
户名为sa,密码为空。 由于本系统采
用
的是ADO连接数据库方法,而且系统中又有相应的配置服务器窗口,所以只要安装好SQL Server2000及数据库的附加(就是步骤2的配置);
用
户可以直接运行Manager.exe执行文件,可以操作本系统的功能。 3. 第三方控件的安装 如果
用
户想
在
本程序的基础上继续
开发
新的功能,需要安装第三方控件,因为
在
本系统中使
用
了大量的第三方控件,想要顺利的通过程序的编译,必需安装控件,否则将通不过编译,也无法继续完善新的功能。 本系统使
用
到的所有控件放
在
源代码同一目录下,
在
“bin”文件目录下面,主要包括Ajax.dll,asp
net
pager.dll和FreeTextBox.dll。 打开Microsoft Visual Studio 2008
开发
环境,打开页面,
在
左边的“
工具
箱”中打开“Web窗体”空白处右击点“添加/移除项…”见下图B-7 4.2系统实现 可以写上程序的界面及相关程序,必须要有对界面及代码的解释内容,不能代码原样拷贝。 5.系统测试 5.1测试方法 (1)逻辑覆盖法。 (2)等价划分法。 (3)边值分析法。 (4)因过图法。 (5)错误猜测法。 (
6
)综合分析法。 5.2测试环境 5.3测试
用
例及测试结果
C#微软培训资料
<> 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 Wel
com
e 程序 .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 常 量 .4
6
5.3 小 结 .47 第六章 类 型 转 换 .48
6
.1 隐式类型转换 .48
6
.2 显式类型转换 .53
6
.3 小 结 .5
6
第七章 表 达 式 .58 7.1 操 作 符 .58 7.2 算术操作符和算术表达式.59 7.3 赋值操作符和赋值表达式.
6
4 7.4 关系操作符和关系表达式.
6
5 <> page begin==================== 7.5 逻辑操作符和逻辑表达式.
6
8 7.
6
位 运 算 .
6
9 7.7 其它特殊操作符 .72 7.8 小 结 .77 第八章 流 程 控 制 .79 8.1 条 件 语 句 .79 8.2 循 环 语 句 .8
6
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 小 结 .14
6
第十三章 事件和索引指示器 .148 13.1 事 件 .148 13.2 索引指示器 .151 13.3 小 结 .154 第十四章 继 承 .155 14.1 C#的继承机制.155 <> page begin==================== 14.2 多 态 性 .159 14.3 抽象与密封 .1
6
3 14.4 继承中关于属性的一些问题.1
6
9 14.5 小 结 .172 第四部分 深入了解 C#.174 第十五章 接 口 .174 15.1 组件编程技术 .174 15.2 接 口 定 义 .177 15.3 接口的成员 .178 15.4 接口的实现 .182 15.5 抽象类与接口 .195 15.
6
小 结 .19
6
第十六章 组织应
用
程序 .198 1
6
.1 基 本 概 念 .198 1
6
.2 使
用
名字空间 .200 1
6
.3 使
用
指示符 .203 1
6
.4 程 序 示 例 .20
6
1
6
.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 错 误 码.25
6
附录 C
.
Net
名字空间成员速查.2
6
9 参 考 资 料 .300 <> page begin==================== 第一部分 C#
语言
概述 第一章 第一章第一章 第一章
.
NET
编程语 编程编程 编程 言
语言
语言
语言
C# 未来 未来未来 未来 5 年 年年 年 我们的目标就 我们的目标就我们的目标就 我们的目标就是超 是是 是 越今天各自为营的 超越今天各自为营的超越今天各自为营的 超越今天各自为营的 Web 站点 站点站点 站点 把 把把 把 Inter
net
建成一 建成建成 建成 个 一个一 一个可 可个可 可 以互相交换组件的地方 以互相交换组件的地方以互相交换组件的地方 以互相交换组件的地方 比尔 比尔比尔 比尔.盖茨 盖茨盖茨 盖茨
在
本章中你将了解 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
的认同 并且
开发
出其他基于 Inter
net
的服务
那么
你是否想知道 究竟什么是
.
NET
?
请听听微软官员的声音 因特网的革命 从微软的角度来讲 我们就是要 建设一个平台来创建并且支持新一代的应
用
我们必须有一套通
用
系统服务来支 持这样的操作 这种观点就说明 我们还有下一个层次的发展 也就是说因特网下一 步的发展 它将使因特网的作
用
远远超越展现一个网站
.
NET
首先是一个
开发
平台 它定义了一种公
用
语言
子集
Com
mon 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
为我们描绘的一个未来生活的场景 人们的需要总是无法满足 我们不断地问自己 我们还应该有些什么 需求推 动着技术的进步
在
二十一世纪 Inter
net
将成为商业活动的主要场所 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
结构框架 让我们翻开教科书 回顾一下近十年来软件
开发
的历史 多年以前 当微软的组件对象模型
Com
ponent 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
平台的基础架构 其强大功能来自于公共
语言
运行时
Com
mon 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 服务 这样通过 Inter
net
可以被运行于任何操作系统上任何编程
语言
所
调
用
不但如此 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 服务 并允许它们通过 Inter
net
被 运行
在
任何操作系统上的任何
语言
所
调
用
举个例子 XML 已经成为网络中数据结构 传送的标准 为了提高效率 C#允许直接将 XML 数据映射成为结构 这样就可以有 <> page begin==================== 效地处理各种数据 1.3.4 完全的安全性与错误处理
语言
的安全性与错误处理能力 是衡量一种
语言
是否优秀的重要依据 任何人都 会犯错误 即使是最熟练的程序员也不例外 忘记变量的初始化 对不属于自己管理 范围的内存空间进行修改 这些错误常常产生难以预见的后果 一旦这样的软 件被投入使
用
寻找与改正这些简单错误的代价将会是让人无法承受的 C#的先进设 计思想可以消除软件
开发
中的许多常见错误 并提供了包括类型安全
在
内的完整的安 全性能 为了减少
开发
中的错误 C#会帮助
开发
者通过更少的代码完成相同的功能 这不但减轻了编程人员的工作量 同时更有效地避免了错误发生
.
NET
运行库提供了代码访问安全特性 它允许管理员和
用
户根据代码的 ID 来配 置安全等级
在
缺省情况下 从 Inter
net
和 Intra
net
下载的代码都不允许访问任何本地 文件和资源 比方说 一个
在
网络上的共享目录中运行的程序 如果它要访问本地的 一些资源
那么
异常将被触发 它将会无情地被异常扔出去 若拷贝到本地硬盘上运 行则一切正常 内存管理中的垃圾收集机制减轻了
开发
人员对内存管理的负担
.
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
公
用
语言
规范
Com
mon 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 中却是 1
6
位 至 于日期时间与字符串类型
在
这方面的区别就更加明显了 VOS 的建立就是为了改变这种状况 它既支持过程性
语言
也支持面向对象的
语言
同时提供了一个类型丰富的系统来容纳它所支持的各种
语言
的特性 它
在
最大程度上 屏蔽了不同
语言
类型系统间的转换 使程序员能够随心所欲地选择自己喜欢的
语言
当 然 这种
语言
必须支持
.
NET
应
用
从事
开发
保证了不同
语言
间的集成 对于过程性
语言
它描述了值的类型并指定了类型的所有值必须遵守的规则
在
面向对象的
语言
方面 它统一了不同编程
语言
的对象模型 每一个对象
在
VOS 中都被 唯一标识以与其它对象相区别 <> page begin==================== 2.1.2 元数据 元数据是对 VOS 中类型描述代码的一种称呼
在
编译程序将源代码转换成为中间 代码时 它将自动生成 并与编译后的源代码共同包含
在
二进制代码文件中 元数据 携带了源代码中类型信息的描述 这
在
一定程度上解决了版本问题 程序使
用
的类型 描述与其自身绑定
在
一起
在
CLR 定位与装载类型时 系统通过读取并解析元数据来获得应
用
程序中的类型 信息 JIT 编译器获得加载的类型信息后 将中间
语言
代码翻译成为本地代码
在
此基 础上根据程序或
用
户要求建立类型的实例 由于整个过程中 CLR 始终根据元数据建 立并管理对应特定应
用
程序的类型 从而保证了类型安全性 此外 元数据
在
解决方法的
调
用
建立运行期上下文界限等方面都有着自己的作
用
而关于元数据的一切都由
.
NET
在
后台完成 2.1.3 公
用
语言
规范 公
用
语言
规范
Com
mon 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.CLS
Com
pliantAtribute 类来标识一个集合或者类是否是符合 CLS 规范的
在
System.CLS
Com
pliantAtribute 的构造器中有一个 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
Com
piler (lc.exe) 产生可包含
在
可执行二进制文件中的二进制资源文 件 14. Certificate Creation Utility (makecert.exe) 生成 X.509 证书与
用
于数字签名的公
用
与私有密钥 15. Permissions View Utility(permview.exe) 通过一个集合浏览许可集的
工具
1
6
. 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 服务相通信的 客户应
用
2
6
. 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 Wel
com
e 程序 可以这么说 与
用
户没有任何交互的应
用
程序根本没有任何
用
处 病毒和黑客当 然除外 然而即使是病毒程序的作者 也常常喜欢
在
自己得逞之后炫耀一番 学习任 何一门
语言
绝大多数情况下人们都是从输入输出开始的 第一个程序总是非常简单的 我们让
用
户通过键盘输入自己的名字 然后程序
在
屏幕上打印一条欢迎信息 程序的代码是这样的 程 程序 序清 清单单 3-1 using System; class Wel
com
e { static void Main() { Console.WriteLine("Please enter your name:"); Console.ReadLine(); Console.WriteLine("Wel
com
e to you!"); } } 您可以
在
任意一种编辑软件中完成上述代码的编写 然后把文件存盘 文件名叫 做 Wel
com
e.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 Wel
com
e { static void Main() { System.Console.WriteLine("Please enter your name:"); System.Console.ReadLine(); System.Console.WriteLine("Wel
com
e to you!"); } } 也就是说
在
每个 Console 前加上一个前缀 System. 这个小原点 . 表示 Console 是作为 System 的成员而存
在
的 C#中抛弃了 C 和 C++中繁杂且极易出错的操作符像 : 和 -> 等 C#中的复合名字一律通过 . 来连接 System 是
.
Net
平台框架提供的最基本的名字空间之一 有关名字空间的详细使
用
方法我们将放
在
第十七章中详细介绍
在
这里 只要我们学会怎样导入名字空间就足 够了 3.2.2 类和类的方法 让我们从写第一个程序时就记住 每个东西都必须属于一个类 如果您是 C 或 C++ 的程序员 请暂时忘掉那些全局变量
在
程序的第二行 class Wel
com
e 声明了一个类 类的名字叫做 Wel
com
e 这个程 序为我们所作的事情就是依靠它来完成的 和 C C++中一样 源代码块被包含
在
一对大括号 { 和 } 中 每一个右括号 } 总是和它前面离它最近的一个左括号 { 相配套 如果左括号 { 和右括号 } 没有全部配套 那程序就是一个错误的程序 static void Main()表示类 Wel
com
e 中的一个方法 方法总是为我们完成某件工作的 注意
在
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 Wel
com
e { static void Main() { Console.WriteLine("Please enter your name:"); string name = Console.ReadLine(); Console.WriteLine("Wel
com
e to you,{0}!",name); } } 我们
用
到了 string name = Console.ReadLine()这条语句 其中 string name 表示声明一 个字符串类型的变量 name 系统定义的 Console 类提供的方法 ReadLine()的返回值类型 为 string 所以 这句话表示从输入设备读取一个字符串 并把读取的值赋予变量 name 再来看一下程序的最后一条输出语句 Console.WriteLine("Wel
com
e to you,{0}!",name); 这条语句表示
在
屏幕上对输出的字符串进行格式化 其中表示
用
方法的第二个参 数来替代格式化后字符串相应的位置 对字符串进行格式化的参数可以是一个字符串 也可以是一个字符 或者是一个整数 等等 采
用
这种方式最多可以格式化三个变量 比如 int x = 3; string name1 = “Mike”; <> page begin==================== string name2 = “John”; Console.WriteLine("Wel
com
e 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 Wel
com
e { static void Main() { Console.WriteLine("Please enter your name:"); string message = “Wel
com
e to you “ + Console.ReadLine(); Console.WriteLine(mesage); } } 3.3 运 行 程 序 理解了源程序中每条代码的具体含义之后 下一步要做的就是让这个程序真正能 够运行 不过对源代码即使还有不明白的地方也没有关系
在
后续章节的学习中 您 最终会熟练掌握这些概念的 如果您的电脑上安装了 Visual Studio
.
Net
则可以
在
集成
开发
环境 Integrated Developer Environment IDE 中直接选择快捷键或菜单命令 编译并执行源文件 如果您不具备这个条件
那么
您至少需要安装 Microsoft
.
Net
Framework SDK 这 样才能够不妨碍您
在
本书中继续学习 C#
语言
实际上
.
Net
平台内置了 C#的编译器 下面让我们使
用
这个微软提供的命令行编译器对我们的程序进行编译 启动一个命令行提示符
在
屏幕上输入一行命令 csc wel
com
e.cs <> page begin==================== 我们假设您已经将 wel
com
e.cs 文件保存
在
当前目录下 如果一切正常 wel
com
e.cs 文件将被编译 运行 屏幕上出现一行字符 提示您输入姓名 Please enter your name: 输入任意个字符并按下回车键 屏幕将打印出欢迎信息 Wel
com
e to you! 注意 和到目前为止我们使
用
过的绝大多数编译器不同
在
C#中 编译器只执行 编译这个过程 而
在
C 和 C++中要经过编译和链接两个阶段 换而言之 C#源文件并不 被编译为目标文件 .obj 而是直接生成可执行文件 .exe 或动态链接库 .dll C#编译器中不需要包含链接器 编译选项 我们可以灵活地使
用
.
Net
平台提供的命令行编译器的不同选项 选择不同的编译 方式 从而灵活地对编译进行控制 例如 如果我们希望对源文件 Wel
com
e.cs 进行编译 生成名为 MyWel
com
e.exe 的 可执行文件 我们可以采
用
这样的命令 csc/out: MyWel
com
e.exe Wel
com
e.cs 如果我们并不需要一个可执行文件 而仅仅是希望简单地检查源文件中是否存
在
语法错误 则命令可以写成 csc/nooutput: Wel
com
e.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 添 加 注 释 应
用
程序并不是只要你自己一个人能看懂就够了 不管以前计算机老师或者是编 程书籍是否已经告诫过 这里我还要再一次强调 养成良好的代码注释的习惯 这是 一名优秀的程序员必备的条件之一 代码注释不会浪费您的编程时间 它只会提高您 的编程效率 使您的程序更加清晰 完整 友好 注释的方式和 ++没有区别 每一行中双斜杠 后面的内容 以及
在
分割符 和 之间的内容都将被编译器忽略 这样 我们就可以采
用
进行单行注释 采
用
分割符 和 进行多行注释 让我们对 Wel
com
e 程序加上注释 程 程序序清 清单 单 3-5 源文件 wel
com
e.cs / 说明 这里是我的第一个 程序 <> page begin==================== using System; class Wel
com
e { static void Main() { Console.WriteLine("Please enter your name:"); 要求
用
户输入姓名 Console.ReadLine(); 读取
用
户输入 Console.WriteLine("Wel
com
e to you!"); 本行代码
用
于打印欢迎信息 您可以
在
这里添加自己的代码 程序
在
这里结束 } } 上面的注释似乎有些小题大做 但它毕竟说明了 中注释的使
用
方法 下面是对 程序进行注释时要注意的两个问题 首先 避免
在
之后的单行注解中使
用
反斜杠符号 \ 因为反斜杠符号 \
在
中是一个续行符 这样做往往会导致你所不希望的结果出现 例如 当你写了 类似于下面的代码 Console.WriteLine(“The result is:{0}” , / \ 150 );
在
编译这段代码时 表示逻辑上同一行剩余的所有文字被作为注释看待 而续行符 \ 则将这一行同下一行连接起来
那么
第二行也被作为注释的一部分 这 时编译器找不到与第一行的左括号 相匹配的右括号 因此编译出错 其次 分割符 和 之间的注释不能有嵌套注释 这是因为 编译器从遇到第一个分割符 开始 将忽略下一个 直到遇上下一个与 之匹配的分割符 才认为注释结束 这样编译器就会对多余的 报告
发帖
VC.NET
微信扫一扫
点击复制链接
分享社区
下载分享明细
7540
社区成员
2.7w+
社区内容
.NET技术 VC.NET
社区管理员
加入社区
帖子事件
创建了帖子
2001-09-25 09:31
社区公告
暂无公告