文章编号:10618时间:2024-09-28人气:
在现代快速发展的技术环境中,应用程序的性能至关重要。用户期望应用程序快速、响应迅速且可靠。对于使用 Mainwin32 库开发的 Windows 应用程序,遵循面向性能的编程原则至关重要,以满足这些期望。
要提升应用程序性能,必须首先分析其当前状态。有许多工具和技术可用于此目的,包括:
识别性能瓶颈后,可以采取多种技术来改善应用程序性能:
嵌入式系统应具有的特点是:高可靠性;在恶劣的环境或突然断电的情况下,系统仍然能够正常工作;许多嵌入式应用要求实时性,这就要求嵌入式操作系统具有实时处理能力;嵌入式系统和具体应用有机地结合在一起,它的升级换代也是具体产品同步进行;嵌入式系统中的软件代码要求高质量、高可靠性,一般都固化在只读存储器中或闪存中,也就是说软件要求固态化存储,而不是存储在磁盘等载体中。 1、嵌入式系统与嵌入式操作系统1.1 嵌入式系统嵌入式系统是以嵌入式计算机为技术核心,面向用户、面向产品、面向应用,软硬件可裁减的,适用于对功能、可靠性、成本、体积、功耗等综合性能有严格要求的专用计算机系统。 嵌入式系统应具有的特点是:高可靠性;在恶劣的环境或突然断电的情况下,系统仍然能够正常工作;许多嵌入式应用要求实时性,这就要求嵌入式操作系统具有实时处理能力;嵌入式系统和具体应用有机地结合在一起,它的升级换代也是具体产品同步进行;嵌入式系统中的软件代码要求高质量、高可靠性,一般都固化在只读存储器中或闪存中,也就是说软件要求固态化存储,而不是存储在磁盘等载体中。 1.2 嵌入式操作系统嵌入式操作系统EOS(Embedded Operating System)是一种用途广泛的系统软件,过去它主要应用于工业控制和国防系统领域。 EOS负责嵌入系统的全部软、硬件资源的分配、调度作,控制、协调并发活动;它必须体现其所在系统的特征,能够通过装卸某些模块来达到系统所要求的功能。 目前,已推出一些应用比较成功的EOS产品系列。 随着 Internet技术的发展、信息家电的普及应用及EOS的微型化和专业化,EOS开始从单一的弱功能向高专业化的强功能方向发展。 嵌入式操作系统在系统实时高效性、硬件的相关依赖性、软件固化以及应用的专用性等方面具有较为突出的特点。 EOS是相对于一般操作系统而方的,它除具备了一般操作系统最基本的功能,如任务调度、同步机制、中断处理、文件处理等外,还有以下特点:①可装卸性。 开放性、可伸缩性的体系结构。 ②强实时性。 EOS实时性一般较强,可用于各种设备控制当中。 ③统一的接口。 提供各种设备驱动接口。 ④操作方便、简单、提供友好的图形GUI,图形界面,追求易学易用。 ⑤提供强大的网络功能,支持TCP/IP协议及其它协议,提供TCP/UDP/IP/PPP协议支持及统一的MAC访问层接口,为各种移动计算设备预留接口。 ⑥强稳定性,弱交互性。 嵌入式系统一旦开始运行就不需要用户过多的干预,这就要负责系统管理的EOS具有较强的稳定性。 嵌入式操作系统的用户接口一般不提供操作命令,它通过系统的调用命令向用户程序提供服务。 ⑦固化代码。 在嵌入式系统中,嵌入式操作系统和应用软件被固化在嵌入式系统计算机的ROM中。 辅助存储器在嵌入式系统中很少使用,因此,嵌入式操作系统的文件管理功能应该能够很容易地拆卸,而用各种内存文件系统。 ⑧更好的硬件适应性,也就是良好的移植性。 国际上用于信息电器的嵌入式操作系统有40种左右。 现在,市场上非常流行的EOS产品,包括3Com公司下属子公司的Palm OS,全球占有份额达50%,Microsoft公司的Windows CE不过29%。 在美国市场,Palm OS更以80%的占有率远超Windows CE。 开源的linux很适于做信息家电的开发。 比如:中科红旗软件技术有限公司开发的红旗嵌入式Linux和美商网虎公司开发的基于Xlinux 的嵌入式操作系统“夸克”。 “夸克”是目前全世界最小的Linux,它有两具很突出的特点,就是体积小和使用GCS编码。 2、三种常用的嵌入式操作系统2.1 Palm OSPalm是3Com公司的产品,其操作系统为Palm OS。 Palm OS是一种32位的嵌入式操作系统。 Palm提供了串行通信接口和红外线传输接口,利用它可以方便地与其它外部设备通信、传输数据;拥有开放的OS应用程序接口,开发商可根据需要自行开发所需的应用程序。 Palm OS是一套具有术强开放性的系统,现在有大约数千种专用为Palm OS编写的应用程序,从程序内容上看,小到个人管理、游戏,大到行业解决方案,Palm OS无所不包。 在丰富的软件支持下,基于Palm OS的掌上电脑功能得以不断扩展。 Palm OS是一套专门为掌上电脑开发的OS。 在编写程序时,Palm OS充分考虑了掌上电脑内存相对较小的情况,因此它只占有非常小的内存。 由于基于Palm OS编写的应用程序占用的空间也非常小(通常只有几十KB),所以,基于Palm OS的掌上电脑(虽然只有几MB的RAM)可以运行众多应用程序。 由于Palm产品的最大特点是使用简便、机体轻巧,因此决定了Palm OS应具有以下特点。 ①操作系统的节能功能。 由上掌上电脑要求使用电源尽可能小,因此在Palm OS的应用程序中,如果没有事件运行,则系统设备进入半休眠(doze)的状态;如果应用程序停止活动一段时间,则系统自动进入休眠(sleep)状态。 ②合理的内存管理。 Palm的存储器全部是可读写的快速RAM,动态RAM(Dynamic RAM)类似于PC机上的RAM,它为全局变量和其它不需永久保存的数据提供临时的存储空间;存储RAM(Storage RAM)类似于PC机上的硬盘,可以永久保存应用程序和数据。 ③Palm OS的数据是以数据库(database)的格式来存储的。 数据库是由一组记录(records)和一些数据库头信息组成的。 为保证程序处理速度和存储器空间,在处理数据的时候,Palm OS不是把数据从存储堆(Storage Heap)拷贝到动态堆(Dynamic Heap)后再进行处理,而是在存储堆中直接处理。 为避免错误地调用存储器地址,Palm OS规定,这一切都必须调用其内存管理器里的API来实现。 Palm OS与同步软件(HotSync)结合可以使掌上电脑与PC机上的信息实现同步,把台式同的功能扩展到了掌上电脑。 Palm应用范围相当广泛,如:联络及工作表管理、电子邮件及互联网通信、销售人员及组别自动化等等。 Palm外围硬件也十分丰富,有数码相机、GPS接收器、调制解调器、GSM无线电话、数码音频播放设备、便携键盘、语音记录器、条码扫描、无线寻呼接收器、探测仪。 其中Palm与GPS结合的应用,不但可以作导航定位,还可以结合GPS作气候的监测、地名调查等。 2.2 Windows CEWindows CE是微软开发的一个开放的、可升级的32位嵌入式操作系统,是基于掌上型电脑类的电子设备操作。 它是精简的Windows 95。 Windows CE的图形用户界面相当出色。 其中CE中的C代表袖珍(Compact)、消费(Consumer)、通信能力(Connectivity)和伴侣(Companion);E代表电子产品(Electronics)。 与Windows 95/98、Windows NT不同的是,Windows CE是所有源代码全部由微软自行开发的嵌入式新型操作系统,其操作界面虽来源于Windows 95/98,但Windows CE是基于Win32 API重新开发的、新型的信息设备平台。 Windows CE具有模块化、结构化和基于Win32应用程序接口以及与处理器无关等特点。 Windows CE不仅继承了传统的Windows图形界面,并且在Windows CE平台上可以使用Windows 95/98上的编程工具(如Visual Basic、Visual C++等)、使用同样的函数、使用同样的界面网格,使绝大多数的应用软件只需简单的修改和移植就可以在Windows CE平台上继续使用。 Windows CE的设计目标是:模块化及可伸缩性、实时性能好,通信能力强大,支持多种CPU。 它的设计可以满足多种设备的需要,这些设备包括了工业控制器、通信集线器以及销售终端之类的企业设备,还有像照相机、电话和家用娱乐器材之类的消费产品。 一个典型的基于Windows CE的嵌入系统通常为某个特定用途而设计,并在不联机的情况下工作。 它要求所使用的操作系统体积较小,内建有对中断的响应功能。 Windows CE的特点有:①具有灵活的电源管理功能,包括瞬眠/唤醒模式。 ②使用了对象存储(object store)技术,包括文件系统、注册表及数据库。 它还具有很多高性能、高效率的操作系统特 性,包括按需换页、共享存储、交叉处理同步、支持大容量堆(heap)等。 ③拥有良好的通信能力。 广泛支持各种通信硬件,亦支持直接的局域连接以及拨号连接,并提供与PC、内部网以及Internet的连接,还提供与Windows 9x/NT的最佳集成和通信。 ④支持嵌套中断。 允许更高优先级别的中断首先得到响应,而不是等待低级别的ISR完成。 这使得该操作系统具有嵌入式操作系统所要求的实时性。 ⑤更好的线程响应能力。 对高级别IST(中断服务线程)的响应时间上限的要求更加严格,在线程响应能力方面的改进,帮助开发人员掌握线程转换的具体时间,并通过增强的监控能力和对硬件的控制能力帮助他们创建新的嵌入式应用程序。 ⑥256个优先级别。 可以使开发人员在控制嵌入式系统的时序安排方面有更大的灵活性。 ⑦Windows CE的API是Win32 API的一个子集,支持近1500个Win32 API。 有了这些API,足可以编写任何复杂的应用程序。 当然,在Windows CE系统中,所提供的API也可以随具体应用的需求而定。 在掌上型电脑中,Windows CE包含如下一些重要组件:Pocket Outlook及其组件、语音录音机、移动频道、远程拨号访问、世界时钟、计算器、多种输入法、GBK字符集、中文TTF字库、英汉双向词典、袖珍浏览器、电子邮件、Pocket Office、系统设置、Windows CE Services软件。 2.3 LinuxLinux是一个类似于Unix的操作系统。 它起源于芬兰一个名为Linus Torvalds的业余爱好,但是现在已经是最为流行的一款开放源代码的操作系统。 Linux从1991年问世到现在,短短10年的时间内已发展成为一个功能强大、设计完善的操作系统,伴随网络技术进步而发展起来的Linux OS已成为Microsoft公司的DOS和Windows 95/98的强劲对手。 Linux系统不仅能够运行于PC平台,还在嵌入式系统方面大放光芒,在各种嵌入式Linux OS迅速发展的状况下,Linux OS逐渐形成了可与Windows CE等EOS进行抗衡的局面。 目前正在开发的嵌入式系统中,49%的项目选择Linux作为嵌入式操作系统。 Linux现已成为嵌入式操作的理想选择。 中科红旗软件技术有限公司开发的红旗嵌入式Linux正在成为许多嵌入式设备厂商的首选。 在不到一年的时间内,红旗公司先后推出了PDA、机顶盒、瘦客户机、交换机用的嵌入式Linux系统,并且投入了实际应用。 现以红旗嵌入式Linux为例来讲解嵌入式Linux OS的特点:①精简的内核,性能高、稳定,多任务。 ②适用于不同的CPU,支持多种体系结构,如X86、ARM、MIPS、ALPHA、SPARC等。 ③能够提供完善的嵌入式GUI以及嵌入式X-Windows。 ④提供嵌入式浏览器、邮件程序、MP3播放器、MPEG播放器、记事本等应用程序。 ⑤提供完整的开发工具和SDK,同时提供PC上的开发版本。 ⑥用户可定制,可提供图形化的定制和配置工具。 ⑦常用嵌入式芯片的驱动集,支持大量的周边硬件设备,驱动丰富。 ⑧针对嵌入式的存储方案,提供实时版本和完善的嵌入式解决方案。 ⑨完善的中文支持,强大的技术支持,完整的文档。 ⑩开放源码,丰富的软件资源,广泛的软件开发者的支持,价格低廉,结构灵活,适用面广。 3、三种嵌入式操作系统的比较3.1 Linux OS与Windows Ce的比较嵌入式Linux OS与Windows CE相比的优点:第一,Linux是开放源代码的,不在存黑箱技术,遍布全球的众多Linux爱好者都是Linux开发者的强大技术支持者;而 Windows CE是非开放性OS,使第三方很难实现产品定制。 第二,Linux的源代码随处可得,注释丰富,文档齐全,易于解决各种问题。 第三,Linux的内核小、效率高;而Windows CE在这方面是笨拙的,占用过多的RAM,应用程序庞大。 第四,Linux是开放源代码的OS,在价格上极具竞争力,适合中国国情。 Windows CE的版权费用是厂家不得不考虑的因素。 第五,Linux不仅支持x86芯片,还是一个跨平台的系统。 到目前为止,它可以支持20~30种CPU,很多 CPU(包括家电业的芯片)厂商都开始做Linux的平台移植工作,而且移植的速度远远超过Java的开发环境。 如果今天采用Linux环境开发产品,那么将来更换CPU时就不会遇到更换平台的困扰。 第六,Linux内核的结构在网络方面是非常完整的,它提供了对包括十兆位、百兆位及千兆位的以太网络,还有无线网络、Token ring(令牌环)和光纤甚至卫星的支持。 第七,Linux在内核结构的设计中考虑适应系统的可裁减性的要求,Windows CE在内核结构的设计中并未考虑适应系统的高度可裁减性的要求。 嵌入式Linux OS与Windows CE相比的弱点:第一,是开发难度较高,需要很高的技术实力;第二,是核心调试工具不全,调试不太方便,尚没有很好的用户图形界面;第三,与某些商业OS 一样,嵌入式Linux占用较大的内存,当然,人们可以去掉部分无用的功能来减小使用的内存,但是如果不仔细,将引起新的问题;第四,有些Linux的应用程序需要虚拟内存,而嵌入式系统中并没有或不需要虚拟内存,所以并非所有的Linux应用程序都可以在嵌入式系统中运行。 3.2 Palm OS与Windows CE的比较3Com公司的Palm OS是掌上电脑市场中较为优秀的嵌入式操作系统,是针对这一市场专门设计的系统。 它有开放的操作系统应用程序接口(API),支持开发商根据需要自行开发所需的应用程序,具有十分丰富的应用程序。 在掌上电脑市场上独占其霸主地位已久。 从技术层面上讲,Palm OS是一套专门为掌上电脑开发的操作系统,具有许多Windows CE无法比拟的优势;Windows CE过于臃肿,不适合应用在廉价的掌上电脑中。 Palm OS是一套具有极强开放性的系统。 开发者向用户免费提供Palm OS的开发工具,允许用户利用该工具在Palm OS基础上方便地编写、修改相关软件。 与之相比,Windows CE的开发工具就显得复杂多了,这使得一般用户很难掌握。 这也Palm OS与Windows CE的另一个主要区别。 我们从常用EOS的大小、可开发定制、互操作性、通用性、实时性及应用领域几个方面,通过表1来归纳如下:结语Palm OS、Windows CE、Linux这三种嵌入式操作系统各有不同的特点,不同的用途;但Linux比Palm OS和Windows CE更小、更稳定,而且Linux是开放的OS,在价格上极具竞争力。 如今整个市场尚未成型,嵌入式操作系统也未形成统一的国际标准,而且Linux的一系列特征又为我们开发国产的嵌入式操作系统提供了方便,因此,我们有机会在这个未成熟的市场上占有一席之地。
网络的百科有详细的介绍的:【概述】C++,这个词在中国大陆的程序员圈子中通常被读做“C加加”,而西方的程序员通常读做“C plus plus”,它是一种使用非常广泛的计算机编程语言。
C++是一种静态数据类型检查的,支持多重编程范式的通用程序设计语言。
它支持过程序程序设计、数据抽象、面向对象程序设计、泛型程序设计等多种程序设计风格。
贝尔实验室的本贾尼·斯特劳斯特卢普(w:en:Bjarne Stroustrup)博士在20世纪80年代发明并实现了C++(最初这种语言被称作“C with Classes”)。
一开始C++是作为C语言的增强版出现的,从给C语言增加类开始,不断的增加新特性。
虚函数(virtual function)、运算符重载(operator overloading)、多重继承(multiple inheritance)、模板(template)、异常(exception)、RTTI、名字空间(name space)逐渐被加入标准。
1998年国际标准组织(ISO)颁布了C++程序设计语言的国际标准ISO/IEC -1998。
遗憾的是,由于C++语言过于复杂,以及他经历了长年的演变,直到现在(2004年)只有少数几个编译器完全符合这个标准(这么说也是不完全正确的,事实上,至今为止没有任何一款编译器完全支持ISO C++)。
另外,就目前学习C++而言,可以认为他是一门独立的语言;他并不依赖C语言,我们可以完全不学C语言,而直接学习C++。
根据《C++编程思想》(Thinking in C++)一书所评述的,C++与C的效率往往相差在正负5%之间。
所以有人认为在大多数场合C++ 完全可以取代C语言(然而我们在单片机等需要谨慎利用空间、直接操作硬件的地方还是要使用C语言)。
【子语言】根据Effective C++第三版第一条款的描述,现在C++由以下四个“子语言”组成:1、C子语言。
C++支持C语言的几乎全部功能,在语法上与C语言仅有极微妙的差别(如括号表达式的左右值性,具体请参考C++标准文献)。
2、面向对象的C++。
C++首先作为一门面向对象的语言而闻名,这个特点在这里不再详述。
3、泛型编程语言。
C++强大(但容易失控的)模板功能使它能在编译期完成许多工作,从而大大提高运行期效率。
4、STL(C++标准模板库)。
随着STL的不断发展,它已经逐渐成为C++程序设计中不可或缺的部分,其效率可能比一般的naive代码低些,但是其安全性与规范性使它大受欢迎。
【语言发展】C++语言发展大概可以分为三个阶段:第一阶段从80年代到1995年。
这一阶段C++语言基本上是传统类型上的面向对象语言,并且凭借着接近C语言的效率,在工业界使用的开发语言中占据了相当大份额;第二阶段从1995年到2000年,这一阶段由于标准模板库(STL)和后来的Boost等程序库的出现,泛型程序设计在C++中占据了越来越多的比重性。
当然,同时由于Java、C#等语言的出现和硬件价格的大规模下降,C++受到了一定的冲击;第三阶段从2000年至今,由于以Loki、MPL等程序库为代表的产生式编程和模板元编程的出现,C++出现了发展历史上又一个新的高峰,这些新技术的出现以及和原有技术的融合,使C++已经成为当今主流程序设计语言中最复杂的一员。
【C++的Hello World程序】在使用兼容C89标准(也称为ANSI C)的编译器时,下面这个程序显示“Hello, world!”然后结束运行: (事实上这并不是符合98标准[ISO C++]的C++程序,而且在多数编译器上这个程序也不能运行,若要在比较旧的编译器上编译该程序,应将iostream改为iostream.h)#include
C#(读做 C sharp,中文译音“夏普”)是微软公司发布的一种面向对象的、运行于 Framework之上的高级程序设计语言,并定于在微软职业开发者论坛(PDC)上登台亮相.C#是微软公司研究员Anders Hejlsberg的最新成果.C#看起来与Java有着惊人的相似;它包括了诸如单一继承,界面,与Java几乎同样的语法,和编译成中间代码再运行的过程.但是C#与Java有着明显的不同,它借鉴了Delphi的一个特点,与COM(组件对象模型)是直接集成的,而且它是微软公司 windows网络框架的主角. 在本文中,我将考察创建一种新计算机语言的一般动机,并将特别指明是什么原因导致了C#的出现.然后我将介绍C#和它与Java,c,c++的相似之处.其次我将讨论一些存在于Java和C#之间的高层次的,和基础的差别.我将以衡量在用多种语言开发大型应用程序的时候所需的知识(或者对这种知识的缺乏程度)来结束本文,而这正是和C#的一个主要战略.目前,C#和还只能以C#语言规则,以及Windows 2000的一个d预览版本,还有MSDN上迅速增多的文档集子的形式获得(还没有最终定型). 微软c#语言定义主要是从C和C++继承而来的,而且语言中的许多元素也反映了这一点.C#在设计者从C++继承的可选选项方面比Java要广泛一些(比如说structs),它还增加了自己新的特点(比方说源代码版本定义).但它还太不成熟,不可能挤垮Java.C#还需要进化成一种开发者能够接受和采用的语言.而微软当前为它的这种新语言大造声势也是值得注意的.目前大家的反应是:这是对Java的反击. C#更象Java一些,虽然微软在这个问题上保持沉默.这也是意料中的事情,我觉得,因为Java近来很成功而使用Java的公司都报告说它们在生产效率上比C++获得了提高. Java所带来的巨大影响和大家对它的广泛接受已经由工作于这种语言和平台之上的程序员数量明显的说明了(估计世界范围内共有两百五十万程序员使用Java).由这种语言写成的应用程序的数量是令人惊讶的并已经渗透了每一个级别的计算,包括无线计算和移动电话(比如日本发明的Java电话).C#能够在用户领域获得这样的礼遇吗?我们必须等待并观望,就象已经由SSI公司的CEO和主席Kalpathi S. Suresh指出来的那样,我发现所有这些都是渐进的.如果C#不存在,我们总能回到Java或C和C++.这些都不完全是新技术;它们在更大的意义上来说只是大公司制造的市场噱头.我们必须给他们时间安顿下来看看这些是不是真的对IT工业有什么影响. C#从Java继承而来的特点 类:在C#中类的申明与Java很相似.这是合理的因为经验告诉我们Java模型工作得很好的关键字import已经被替换成using,它起到了同样的作用.一个类开始执行的起点是静态方法Main().下面的Hello World程序展示了基本的形式: using System; class Hello { static void Main() { (Hello, world); } } 在这个例子中,System这个名字指向一个包括了基本C#实用类集合的命名空间(namespace).这个命名空间包括了Console类,它在这个例子中被用来输出一个字符串.类可以是抽象的和不可继承的:一个被申明成abstract的类不能被实例化;它只能被用做一个基类.C#关键字sealed就象Java关键字final,它申明一个类不是抽象的,但是它也不能被用做另一个类的基类.界面:就象在Java中一样,一个界面是一组方法集合的抽象定义.当一个类或结构体实现一个界面的时候,它必须实现这个界面中定义的所有方法.一个单一的类可以实现几个界面.也许以后会出现一些微妙的差别,但是这个特点看起来与Java相比没有变化.布尔运算:条件表达式的结果是布尔数据类型,布尔数据类型是这种语言中独立的一种数据类型.从布尔类型到其他类型没有直接的转换过程.布尔常量true和false是C#中的关键字.错误处理:如Java中那样,通过抛出和捕捉异常对象来管理错误处理过程.内存管理:由底层框架进行自动内存垃圾回收. C#从C和C++继承的特点 编译:程序直接编译成标准的二进制可执行形式.但C#的源程序并不是被编译成二进制可执行形式,而是一中中间语言,类似于JAVA字节码。
如果前面的Hello World程序被保存成一个文本文件并被命名为,它将被编译成命的可执行程序. 结构体:一个C#的结构体与C++的结构体是相似的,因为它能够包含数据声明和方法.但是,不象C++,C#结构体与类是不同的而且不支持继承.但是,与Java相同的是,一个结构体可以实现界面. 预编译:C#中存在预编译指令支持条件编译,警告,错误报告和编译行控制.可用的预编译指令有: #define #undef #if #elif #else #endif #warning #error #line [] 没有了#include 伪指令.你无法再用#define 语句对符号赋值,所以就不存在源代码替换的概念--这些符号只能用在#if和#elif伪指令里.在#line伪指令里的数字(和可选的名字)能够修改行号还有#warning和#error输出结果的文件名. 操作符重载:一些操作符能够被重载,而另一些则不能.特别的是,没有一个赋值运算符能够被重载.能够被被重载的单目操作符是: + - ! ~ ++ -- true false 能够被重载的二元运算符是: + - * / % & | ^ << >> == != > < >= <= C#独有的特点 C#最引人入胜的地方是它和Java的不同,而不是相似的地方.这一节(和这个系列第二部分的大部分地方)讲述了C#实现的和Java不同的地方或者Java根本没有的特点. 中间代码:微软在用户选择何时MSIL应该编译成机器码的时候是留了很大的余地.微软公司很小心的声称MSIL不是解释性的,而是被编译成了机器码.它也明白许多--如果不是大多数的话--程序员认为Java程序要不可避免的比C编写的任何东西都要慢.而这种实现方式决定了基于MSIL的程序(指的是用C#,Visual Basic,Managed C++--C++的一个符合CLS的版本--等语言编写的程序)将在性能上超过解释性的Java代码.当然,这一点还需要得到事实证明,因为C#和其他生成MSIL的编译器还没有发布.但是Java JIT编译器的普遍存在使得Java和C#在性能上相对相同.象C#是编译语言而Java是解释性的,之类的声明只是商业技巧的中间代码和MSIL都是中间的汇编形式的语言,它们在运行时或其它的时候被编译成机器代码. 命名空间中的申明:当你创建一个程序的时候,你在一个命名空间里创建了一个或多个类.同在这个命名空间里(在类的外面)你还有可能声明界面,枚举类型和结构体.必须使用using关键字来引用其他命名空间的内容. 基本的数据类型:C#拥有比C,C++或者Java更广泛的数据类型.这些类型是bool, byte, ubyte, short, ushort, int, uint, long, ulong, float, double,和decimal.象Java一样,所有这些类型都有一个固定的大小.又象C和C++一样,每个数据类型都有有符号和无符号两种类型.与Java相同的是,一个字符变量包含的是一个16位的Unicode字符.C#新的数据类型是decimal数据类型,对于货币数据,它能存放28位10进制数字. 两个基本类:一个名叫object的类是所有其他类的基类.而一个名叫string的类也象object一样是这个语言的一部分.作为语言的一部分存在意味着编译器有可能使用它--无论何时你在程序中写入一句带引号的字符串,编译器会创建一个string对象来保存它. 参数传递:方法可以被声明接受可变数目的参数.缺省的参数传递方法是对基本数据类型进行值传递关键字可以用来强迫一个变量通过引用传递,这使得一个变量可以接受一个返回值关键字也能声明引用传递过程,与ref不同的地方是,它指明这个参数并不需要初始值. 与COM的集成:C#对Windows程序最大的卖点可能就是它与COM的无缝集成了,COM就是微软的Win32组件技术.实际上,最终有可能在任何语言里编写COM客户和服务器端.C#编写的类可以子类化一个以存在的COM组件;生成的类也能被作为一个COM组件使用,然后又能使用,比方说,JScript语言子类化它从而得到第三个COM组件.这种现象的结果是导致了一个运行环境的产生,在这个环境里的组件是网络服务,可用用任何语言子类化. 索引下标:一个索引与属性除了不使用属性名来引用类成员而是用一个方括号中的数字来匿名引用(就象用数组下标一样)以外是相似的. public class ListBox: Control { private string[] items; public string this[int index] { get { return items[index]; } set { items[index] = value; Repaint(); } } } 可以用一个循环器来匿名引用字符串内部数组成员,就象下面这样: ListBox listBox = ...; listBox[0] = hello; (listBox[0]); 代理和反馈:一个代理对象包括了访问一个特定对象的特定方法所需的信息.只要把它当成一个聪明的方法指针就行了.代理对象可以被移动到另一个地方,然后可以通过访问它来对已存在的方法进行类型安全的调用.一个反馈方法是代理的特例关键字用在将在事件发生的时候被当成代理调用的方法声明.补充:C#简史——摘自《程序员》杂志2005-12月刊C# 简史编者按:时间过得真快,居然现在就可以写C#的简史了。
但是想想也不奇怪,C#可谓起点高、发展快的新一代语言,它的这五年走过了很多前辈十几年的路。
公允地说,C#是目前兼顾系统开发和应用开发的最佳实用语言,并且很有可能成为编程语言历史上的第一个“全能”型语言。
看过这篇简史,我们都应该明白,不要再把C#看成年轻后生了——只要是“马拉多纳”,就早晚当“球王”。
C# 1.0,纯粹的面向对象当时间回溯到1998年底,微软正在忙于新一代COM的设计工作。
此前,COM一直是组件化开发中非常成功的一种技术;但由于它仅提供了二进制层面上的统一,因此无法将类型信息和用于支持基础平台和开发工具的信息放到组件中。
这时,Java正在逐步走向成熟。
于是,微软学习Java的做法,将虚拟机的概念引入到了COM领域;同时,微软提出了“元数据”的概念,用于描述组件的类型信息和工具支持信息,并决定将其放入到组件当中。
这种“COM虚拟机”的名字在经历了若干争论后,最终被定为CLR(Common Language Runtime,公共语言运行时)。
与此同时,微软提出了在该运行时上运作的语言应该遵循的一些规则,以及该虚拟机的类型系统和指令集——所有这些规范形成了最终的C L I(Common Language Infrastructure,公共语言基础设施),并提交给了ECMA委员会。
同时,微软开发了CLI的一个实现,这就是大名鼎鼎的了。
1998年12月,微软启动了一个全新的语言项目——COOL,这是一款专门为CLR设计的纯面向对象的语言,也正是本文的主角——C#的前身。
历时半年有余,1999年7月份,微软完成了COOL语言的一个内部版本。
直到2000年2月份,微软才正式将COOL语言更名为C#。
据说起这个名字是因为C#开发小组的人很讨厌搜索引擎,因此把大部分搜索引擎无法识别的“#” 字符作为该语言名字的一部分;还有一种说法是在音乐当中“#”是升调记号,表达了微软希望它在C的基础上更上一层楼的美好愿望——当然这些都只是传说,无从考证。
又是历经了一系列的修改,微软终于在2000年7月发布了C#语言的第一个预览版。
因此人们一般认为C#是2000年发布的,并以此来计算它的“年龄”。
在此后的一年多时间里,微软一直在修补各个测试版本中的BUG。
直到2002年2月,微软终于推出了迟迟未上市的Visual Studio 7.0,并将其定名为“VisualStudio 2002”。
随着这套开发环境的出炉,开发者们终于看到了C#语言的第一个正式版本——C# 1.0。
此后,微软马不停蹄,Visual Studio也恢复了往日的开发进度。
在2003年5月,微软如期推出了Visual Studio 2003,同时也发布了C#的改进版本——C# 1.1。
这一时期的C#(以下称为C# 1.x)提出了纯粹的面向对象概念,并在语言特性中展现得淋漓尽致。
C++并非纯面向对象的,为了和C兼容以及提供更高的执行效率,它保留了很多模块化的东西。
Java尽管号称是面向对象的,但实际上,对于对象所应该具备的三种构成结构——属性、方法和事件,Java仅提供了方法,其它两种结构都要通过方法来模拟。
在C# 1.x中,所有面向对象的概念都在语言中得到了非常好的体现。
同时,C#还通过类类型、值类型和接口类型的概念形成了统一的类型系统。
C#使用了大家所熟知的语法实现了方法,以至于很多人认为C#和Java、C++等面向对象语言“非常相像”,这使得从使用其他面向对象语言转到使用C#的过程非常简单。
此外,C#还通过无参数列表的方法声名语法,结合get/set访问器实现了优雅的属性语法。
其中的get访问器相当于获取属性值的方法,可以通过一些运算返回最终的结果,而不是简单地返回一个变量的值;而set访问器相当于设置属性值的方法,在其中可以进行一系列检测,最后将属性值赋给相应的变量。
同时,通过同时提供get和set访问器、只提供get访问器和只提供set访问器,还可以很方便地实现可读写、只读和只写的属性。
C#的这种属性语法,使得一个属性在提供该属性的类的内部看来,非常像一组方法;而对于外部调用类看来,访问一个对象的属性和访问它的公共域没有任何区别。
通过委托(稍后介绍),结合关键字event,C#提供了优雅的事件概念。
使用+=运算符,开发者可以非常方便地将一个事件处理器关联到一个事件上,这个过程称之为“订阅”一个事件。
由于委托内部封装了一个调用链表,因此可以方便地为一个事件添加多个事件处理器,这些处理器会自动地依次调用。
多年的开发语言进化证明,函数指针是非常重要也是非常危险的语言特征之一。
同时,基于函数指针的回调机制也Windows 核心概念之一。
然而,由于函数指针很难验证参数的类型准确性,因此C#(确切地说是CLI)提出了“委托”的概念,这是一种类型安全的函数指针链表。
这意味着,C#不仅可以提供回调机制,同时调用回调的一方还无需在其内部维护函数指针列表,所要做的仅仅是声名一个具有恰当委托类型的公共成员即可;而提供回调的一方也只需通过构造一个带有指定方法的相应委托实例,并通过“+=”运算符添加到回调列表即可。
尽管C# 1.x提供了如此多的新鲜概念,但实际上,这些概念都是由CLI提出的。
因此当将一个C#源程序编译为可执行文件时,编译器做的工作相对而言并不多。
需要编译器代劳的是要将一个简单的委托定义语句翻译为一个继承自类型定义。
C# 2.0,泛型编程新概念微软本打算继续保证开发进度,并在2004年推出Visual Studio 2004,但由于其间软件工程学尤其是软件管理学的大规模进步,微软所提供的这种仅具备开发和调试功能的IDE已经无法满足团队开发的需求。
因此微软决定在项目设计和管理工具方面进行了进一步研发,并将其集成到Visual Studio中,以赢回原有的市场。
因此,微软将Visual 2004“改名”为Visual Studio 2005,并决定推迟一年发布。
不过,微软还是坚持在2004年的6月份发布了Visual Studio2005的第一个Beta 版,同时向开发者展示了C#语言的2.0版本。
2005年4月,微软发布了Visual Studio 2005 Beta2,这已经是具备了几乎全部功能的VisualStudio,包括的产品有SQL Server2005、Team Foundation Server和TeamSuite。
这时的C#编译器已经能够处理C# 2.0中所有的新特性。
C# 2.0为开发者带来的最主要的特性就是泛型编程能力。
和面向对象思想一样,泛型思想也是一种已经成熟的编程思想,但依然是没有哪一种主流开发语言能够支持完备的泛型概念。
这主要是因为泛型的概念在一定程度上对面向对象概念进行冲击,同时,由于在编译期间对类型参数的完全检测很难做到,很多问题会被遗留到运行时。
C# 2.0别出心裁,对泛型类型参数提出了“约束”的新概念,并以优雅的语法体现在语言之中。
有了约束,结合编译器强大的类型推断能力,可以在编译时发现几乎所有“危险”的泛型应用。
C# 2.0的另一个突出的特性就是匿名方法,用来取代一些短小的并且仅出现一次的委托,使得语言结构更加紧凑。
匿名方法除了可以使得事件处理器的编写更加精简以外,还将开发者带入了程序设计的一个新的领域——函数式编程,曾经有高人就用匿名方法结合泛型编程实现了函数式编程中的重要结构—— Lambda 表达式。
尽管这种实现显得很繁琐而且不易理解,但毕竟是实现了。
最终,函数式编程还是被引入到了C#语言中,这将在下一节中为大家讲述。
此外,C# 2.0还进一步增强了语言的表达能力。
在C# 2.0中,属性语法中的get和set访问器可以拥有不同的权限,这就使得定义一个在库的内部可读写,而在库的外部只读的属性成为可能。
同时,C# 2.0还提供了迭代器的概念,这使得一个类无需实现IEnumerator 和IEnumerable接口即可实现一个可以进行遍历的类型,并且无需在类型中维护迭代状态。
此时的已经得到了很广泛的认可,并且因为元数据为组件带来了强大的自我描述能力,许多程序库厂商被吸引到平台上来。
随着程序库数量的增长,逐渐暴露了命名的问题。
在面向对象技术广泛发展后,人们就意识到名字的管理问题,因此几乎所有的面向对象语言都提出了“命名空间”的概念;而在C# 1.x时代,这个问题再一次出现。
如果一个库厂商XX 希望以来命名他们自己的系统基础库,那么当开发者使用using System语句时就会产生歧义。
为此。
C# 2.0中提供了global关键字,这为库中所有的命名空间提供了一个“根”,通过指定global::System和就可以区别两个库了。
这一时期的C#编译器变得非常复杂,泛型的引入使得编译器不得不具备超强的类型推断能力。
同时,迭代器的思想并非是在CLI层面上实现的,而是由编译器自动生成了实现I E n u m e r a t o r 和IEnumerable接口类型。
C# 3.0,魔鬼在经历了一系列的改进和完善后,微软决定于2005年11月发布Visual Studio2005,该开发环境将正式支持C#2.0。
由于此前推出了数个预览版和测试版,大家的期待之情似乎已经不是那么强烈了。
而2005年9 月份的PDC大会则为开发者们带来了另外的惊喜——C#3.0(研发代号“Orcas”——魔鬼)的技术预览版。
说到C# 3.0,就不得不提一下微软的LINQ 项目,LINQ(语言集成查询,Language Integrated Query)提出了一种通过面向对象语法来实现对非面向对象数据源的查询技术,可查询的数据源从关系型数据库延伸到一般意义上的集合(如数组和列表)以及XML。
而C# 3.0则是率先实现了LINQ的语言。
在C# 3.0中,我们可以用类似于SQL语句的语法从一个数据源中轻松地得到满足一定条件的对象集合。
例如要查找一个字符串数组names中所有长度大于5的字符串,就可以写:var longname = from n in names > 5 select n;这样我们就得到一个新的字符数组longname,其中包含了我们所需要的结果。
这种语句称作查询语句,与SQL语句唯一的区别是C#中的查询语句往往把select子句放到最后(这反而倒有些类似于中文的阅读顺序了)。
初次看到这样一个语句,我们可能会有很大疑问:这还是C#语言吗?这的确是合乎语法规则的C#代码,而且编译器可以识别这种语法。
然而实际上,C#编译器并不会对这种语法进行实际的的编译,而是将其翻译为正常的方法调用:var longname = (n => > 5)(n);然后再进行进一步的编译。
在上面的例子中已经说明,names是一个存放有字符串的数组,而数组类型并没有Where的方法。
的确,Where并非names的成员方法,微软也没有对数组类型进行任何改动。
这是C# 3.0中另外一个重要的新特性:扩展方法。
扩展方法是定义在其他静态类中的静态方法,其第一个参数的类型就是希望扩展的类型,并且这个参数被冠以this修饰符。
扩展方法是静态的,但可以像调用被扩展类型的实例方法那样进行调用,看起来好像是被扩展类型自己的方法一样。
这就为语言带来了很大的灵活性,我们可以将一组近似的功能如上面的Where 和Select等(这在LINQ中被称作“标准查询表达式”)定义在一个外部类中,这样既无须修改现有类型,又可以将新功能组织在一起。
当然,为了做到面向对象的封装性,扩展方法只能在被扩展类型的公共成员上进行操作,如果需要从内部对类型进行改进,就必须改变现有类型的代码。
在Where方法的参数列表里,我们又发现了一种奇怪的语法:n => > 5。
这就是我们上文提到过的Lambda 表达式。
微软的官方规范中称,Lambda 表达式是匿名方法的一种自然进化。
因此Lambda 表达式其实也是一种特殊的委托,由编译器负责生成一个匿名的委托类型,它接受一个字符串类型的参数n;返回值为布尔类型,表示n的长度是否大于5;其中的参数类型和返回值类型都是由编译器推断而来的。
说到类型推断,还要解释的一点就是上面的语句中出现的新关键字var。
从出现的位置来看,var应该是一个类型。
然而这又不是一个C#内建类型,也不是CLI提出的新类型;它只是一个“占位符”,它的确表示一个类型,但具体是什么类型需要编译器在编译期间进行推断。
Lamda表达式的真正意义不仅仅在于简化了委托的编写方式,更重要的是它把代码表达式体现为了数据。
换句话说,Lambda表达式不仅可以被编译为一段可以执行的代码(类似于匿名方法),也可以将其翻译为一个数据结构——表达式树。
而如何处理Lambda 表达式,是由编译器根据Lambda表达式的使用方式来自动确定的。
当把一个Lambda表达式赋给一个具有委托类型的域、属性或变量时,编译器像编译匿名方法一样将表达式体翻译成一段可执行代码;而当把一个L a m b d a 表达式赋给一个具有Expression
copy的,你看看语法结构上,C++和C#基本上相同,只有以下方面有所区别:1、继承:C++支持多继承,C#类只能继承一个基类中的实现但可以实现多个接口。 2、数组:声明 C# 数组和声明 C++ 数组的语法不同。 在 C# 中,“[]”标记出现在数组类型的后面。 3、数据类型:在C++中bool类可以与整型转换,但C#中bool 类型和其他类型(特别是 int)之间没有转换。 long 类型:在 C# 中,long 数据类型为 64 位,而在 C++ 中为 32 位。 4、struct 类型:在 C# 中,类和结构在语义上不同。 struct 是值类型,而 class 是引用类型。 5、switch 语句:与 C++ 中的 switch 语句不同,C# 不支持从一个 case 标签贯穿到另一个 case 标签。 C++的switch后跟参数必须是int型,而C#却允许string型6、delegate 类型:委托与 C++ 中的函数指针基本相似,但前者具有类型安全,是安全的。 7、C#中所有对象都只能通过关键词“new”来创建,C++的“类名_对象名”方式在C#中变为声明一个引用。 8、异常处理:C#中引入了 finally 语句,这是C++没有的,C++允许抛出任何类型,而C#中规定抛出类型为一个派生于的对象。 9、C# 运算符:C# 支持其他运算符,如 is 和 typeof。 它还引入了某些逻辑运算符的不同功能。 10、static 的使用:static方法只能由类名调用,改变static变量。 11、C#在构造基类上替代 C++ 初始化列表的方法。 12、Main 方法和 C++ 及Java中的 main 函数的声明方式不同,Main而不能用main13、方法参数:C# 支持 ref 和 out 参数,这两个参数取代指针通过引用传递参数。 14、在 C# 中只能在unsafe不安全模式下才使用指针。 15、在 C# 中以不同的方式执行重载运算符。 16、字符串:C# 字符串不同于 C++ 字符串。 17、C# 中没有全局方法和全局变量:方法和变量必须包含在类型声明(如 class 或 struct)中。 18、C# 中没有头文件和 #include 指令:using 指令用于引用其他未完全限定类型名的命名空间中的类型。 19、C# 中的局部变量在初始化前不能使用。 20、析构函数:在 C# 中,不能控制析构函数的调用时间,原因是析构函数由垃圾回收器自动调用。 21、构造函数:与 C++ 类似,如果在 C# 中没有提供类构造函数,则为您自动生成默认构造函数。 该默认构造函数将所有字段初始化为它们的默认值。 22、在 C# 中,方法参数不能有默认值。 如果要获得同样的效果,需使用方法重载。 c++在设计之初希望提供先进的面向对象特性,同时提供很好的性能。 但是为了保证和以往的程序、开发人员的知识兼容,c++与c语言几乎完全兼容。 c语言本身其实就是现代计算机的高级抽象,可以直接访问地址、通过指针可以访问几乎任何内存地址;堆和栈的结构体现等待。 当然c++也就具有了这样的特性。 随着 c++的逐步发展,generic programming 泛型编程技术和stl标准模板库的引入,c++和c的差异越来越大。 基本上c++是为了高效地使用面向对象技术或者泛型技术编写大规模高性能应用程序(往往是一些相对比较底层的应用程序)而设计的。 没有什么语言能比C++更加贴近Windows本身了,这一点也是不可否认的。 C++更针对计算机的底层,而C#更注重对上层应用程序的支持。 目前绝大多数的大型游戏都是用C++做的,而网络应用、应用软件的半壁江山被C#和JAVA所占领。 C#能做的,C++不一定都能做,C++能做的,C#也不一定都好做。 c#通过底层的虚拟机机制减少了c/c++语言中常常容易发生的内存泄漏和安全性问题,代价是运行速度减慢。 同样的由于简化了编程语言的复杂性(c#远远比c++来得简单),大大提高了开发者的效率。 另外c#具有庞大的类库,这个优势是c++所不具有的。 因此c#非常合适开发企业中处理业务的应用程序。 同时微软所有的操作系统、服务器程序、桌面端程序都在向平台统一。 在历史上与次类似的情形(指微软技术)只有在微软从16位平台向32位平台转变的过程中发生过。 C# 是纯面向对象语言,C++ 除了面向对象,也面向过程。 C# 支持垃圾收集,C++ 不支持垃圾收集。 C#需要虚拟机器,C++ 不需要虚拟机器。 C# 的执行档是中间码,叫做 managed code,透过 NGWS Runtime 来执行。 除了 C#,你也可以用其它程序语言(例如 Visual Basic、C++)来作出 managed code。 C# 使用 Platform-Independent Type,C++ 的 type 会受到平台的影响。 C#调用Win32 API的方式繁杂,C++这一点做得比它好。 但是,C#强大的网络操作,代码量大大地低于C++,我们抛弃不用Socket,改用WinInet或是MFC中的封装好的网络类,比如CHTTPFile,还是没C#简单。 C#的傻瓜式的类库操作和面向对象编程的完美特性,确实让其成为了Windows平台上最受欢迎的语言。 C#中不通过Win32 API就那么一种方式,通过找到进程,然后Kill之,而C++中,我们完全有无数种选择,如进程内存填0,卸载模块,消息洪水,句柄强制关闭,强制释放它的堆等等,甚至注入进去,内部Raise一个异常,它也就会结束。 保护进程,不管内核下还是应用层,C#肯定是做不了的,C++有自己高端的地方,其他语言无法涉足。 所以没有用C#做的杀毒软件就不足为奇了。 C#极其简易的界面操作,令人看着很舒服的编码,他有太多的地方,C++根本无法涉足。 没人拿C++做Web Services,超级大量的数据,拿垃圾回收基本上为0的C++去做,简直就是自找麻烦。 C#的WebForm,和Jsp占据着Web的大片江山,C++不能。 C#是一门博大精深的语言,类库强大。 C#更加注重于软件工程的应用,各种设计模式的使用,C++则注重于实现功能。 C#的前景是不错的,我个人很看好它,MSDN 杂志每期的文章可能有8成是C#,C++不算很多,微软的重心可能在C#上,希望C#逐渐能取代C++。 但是C++会这么容易被取代?不可能。 就像一个搞管理的,你让他接管搞开发的人,让他从干一样到同时兼干这二样,会有这么简单么?c++的生命力至少还要7-8年,之后才会渐渐的淡出,但是只要追求自由的人存在,C++就不会消失;只要操作系统一天是用C++写的,C++就不会消失。 开发数据库,倾向于用C#,做Windows底层,我肯定是C++。 C#的Linq to Sql让不懂数据库的人都能去操做数据库了,辅助一些第三方类库,能发挥强大的威力。 完全取代C++,等操作系统是C#写的,C#能开发系统中的一切组件的时候再说吧,至少现在C#还不能开发IsAPI、驱动。
C#比其它语言的优势 C#(读做 C sharp)是微软公司在去年六月发布的一种新的编程语言,并定于在微软职业开发者论坛(PDC)上登台亮相.C#是微软公司研究员Anders Hejlsberg的最新成果.C#看起来与Java有着惊人的相似;它包括了诸如单一继承,界面,与Java几乎同样的语法,和编译成中间代码再运行的过程.但是C#与Java有着明显的不同,它借鉴了Delphi的一个特点,与COM(组件对象模型)是直接集成的,而且它是微软公司 windows网络框架的主角.在本文中,我将考察创建一种新计算机语言的一般动机,并将特别指明是什么原因导致了C#的出现.然后我将介绍C#和它与Java,c,c++的相似之处.其次我将讨论一些存在于Java和C#之间的高层次的,和基础的差别.我将以衡量在用多种语言开发大型应用程序的时候所需的知识(或者对这种知识的缺乏程度)来结束本文,而这正是和C#的一个主要战略.目前,C#和还只能以C#语言规则,以及Windows 2000的一个d预览版本,还有MSDN上迅速增多的文档集子的形式获得(还没有最终定型).微软c#语言定义主要是从C和C++继承而来的,而且语言中的许多元素也反映了这一点.C#在设计者从C++继承的可选选项方面比Java要广泛一些(比如说structs),它还增加了自己新的特点(比方说源代码版本定义).但它还太不成熟,不可能挤垮Java.C#还需要进化成一种开发者能够接受和采用的语言.而微软当前为它的这种新语言大造声势也是值得注意的.目前大家的反应是:这是对Java的反击.C#更象Java一些,虽然微软在这个问题上保持沉默.这也是意料中的事情,我觉得,因为Java近来很成功而使用Java的公司都报告说它们在生产效率上比C++获得了提高所带来的巨大影响和大家对它的广泛接受已经由工作于这种语言和平台之上的程序员数量明显的说明了(估计世界范围内共有两百五十万程序员使用Java).由这种语言写成的应用程序的数量是令人惊讶的并已经渗透了每一个级别的计算,包括无线计算和移动电话(比如日本发明的Java电话).C#能够在用户领域获得这样的礼遇吗?我们必须等待并观望,就象已经由SSI公司的CEO和主席Kalpathi S. Suresh指出来的那样,我发现所有这些都是渐进的.如果C#不存在,我们总能回到Java或C和C++.这些都不完全是新技术;它们在更大的意义上来说只是大公司制造的市场噱头.我们必须给他们时间安顿下来看看这些是不是真的对IT工业有什么影响.C#从Java继承而来的特点类:在C#中类的申明与Java很相似.这是合理的因为经验告诉我们Java模型工作得很好的关键字import已经被替换成using,它起到了同样的作用.一个类开始执行的起点是静态方法Main().下面的Hello World程序展示了基本的形式:using System;class Hello {static void Main() {(Hello, world);}}在这个例子中,System这个名字指向一个包括了基本C#实用类集合的命名空间(namespace).这个命名空间包括了Console类,它在这个例子中被用来输出一个字符串.类可以是抽象的和不可继承的:一个被申明成abstract的类不能被实例化;它只能被用做一个基类.C#关键字lock就象Java关键字final,它申明一个类不是抽象的,但是它也不能被用做另一个类的基类.界面:就象在Java中一样,一个界面是一组方法集合的抽象定义.当一个类或结构体实现一个界面的时候,它必须实现这个界面中定义的所有方法.一个单一的类可以实现几个界面.也许以后会出现一些微妙的差别,但是这个特点看起来与Java相比没有变化.布尔运算:条件表达式的结果是布尔数据类型,布尔数据类型是这种语言中独立的一种数据类型.从布尔类型到其他类型没有直接的转换过程.布尔常量true和false是C#中的关键字.错误处理:如Java中那样,通过抛出和捕捉异常对象来管理错误处理过程.内存管理:由底层框架进行自动内存垃圾回收.C#从C和C++继承的特点编译:程序直接编译成标准的二进制可执行形式.如果前面的Hello World程序被保存成一个文本文件并被命名为,它将被编译成命的可执行程序.结构体:一个C#的结构体与C++的结构体是相似的,因为它能够包含数据申明和方法.但是,不象C++,C#结构体与类是不同的而且不支持继承.但是,与Java相同的是,一个结构体可以实现界面.预编译:C#中存在预编译指令支持条件编译,警告,错误报告和编译行控制.可用的预编译指令有:#define #undef #if #elif #else#endif#warning #error #line [] 没有了#include 伪指令.你无法再用#define 语句对符号赋值,所以就不存在源代码替换的概念--这些符号只能用在#if和#elif伪指令里.在#line伪指令里的数字(和可选的名字)能够修改行号还有#warning和#error输出结果的文件名.操作符重载:一些操作符能够被重载,而另一些则不能.特别的是,没有一个赋值运算符能够被重载.能够被被重载的单目操作符是:+ - ! ~ ++ -- true false 能够被重载的二元运算符是:+ - * / % & | ^ << >> == != > < >= <=C#独有的特点C#最引人入胜的地方是它和Java的不同,而不是相似的地方.这一节(和这个系列第二部分的大部分地方)讲述了C#实现的和Java不同的地方或者Java根本没有的特点.中间代码:微软在用户选择何时MSIL应该编译成机器码的时候是留了很大的余地.微软公司很小心的声称MSIL不是解释性的,而是被编译成了机器码.它也明白许多--如果不是大多数的话--程序员认为Java程序要不可避免的比C编写的任何东西都要慢.而这种实现方式决定了基于MSIL的程序(指的是用C#,Visual Basic,Managed C++--C++的一个符合CLS的版本--等语言编写的程序)将在性能上超过解释性的Java代码.当然,这一点还需要得到事实证明,因为C#和其他生成MSIL的编译器还没有发布.但是Java JIT编译器的普遍存在使得Java和C#在性能上相对相同.象C#是编译语言而Java是解释性的,之类的声明只是商业技巧的中间代码和MSIL都是中间的汇编形式的语言,它们在运行时或其它的时候被编译成机器代码.命名空间中的申明:当你创建一个程序的时候,你在一个命名空间里创建了一个或多个类.同在这个命名空间里(在类的外面)你还有可能声明界面,枚举类型和结构体.必须使用using关键字来引用其他命名空间的内容.基本的数据类型:C#拥有比C,C++或者Java更广泛的数据类型.这些类型是bool, byte, ubyte, short, ushort, int, uint, long, ulong, float, double,和decimal.象Java一样,所有这些类型都有一个固定的大小.又象C和C++一样,每个数据类型都有有符号和无符号两种类型.与Java相同的是,一个字符变量包含的是一个16位的Unicode字符.C#新的数据类型是decimal数据类型,对于货币数据,它能存放28位10进制数字.两个基本类:一个名叫object的类是所有其他类的基类.而一个名叫string的类也象object一样是这个语言的一部分.作为语言的一部分存在意味着编译器有可能使用它--无论何时你在程序中写入一句带引号的字符串,编译器会创建一个string对象来保存它.参数传递:方法可以被声明接受可变数目的参数.缺省的参数传递方法是对基本数据类型进行值传递关键字可以用来强迫一个变量通过引用传递,这使得一个变量可以接受一个返回值关键字也能声明引用传递过程,与ref不同的地方是,它指明这个参数并不需要初始值.与COM的集成:C#对Windows程序最大的卖点可能就是它与COM的无缝集成了,COM就是微软的Win32组件技术.实际上,最终有可能在任何语言里编写COM客户和服务器端.C#编写的类可以子类化一个以存在的COM组件;生成的类也能被作为一个COM组件使用,然后又能使用,比方说,JScript语言子类化它从而得到第三个COM组件.这种现象的结果是导致了一个运行环境的产生,在这个环境里的组件是网络服务,可用用任何语言子类化.索引下标:一个索引与属性除了不使用属性名来引用类成员而是用一个方括号中的数字来匿名引用(就象用数组下标一样)以外是相似的 class ListBox: Control {private string[] items;public string this[int index] {get {return items[index];}set {items[index] = value;Repaint();}}} 可以用一个循环器来匿名引用字符串内部数组成员,就象下面这样:ListBox listBox = ...;listBox[0] = hello;(listBox[0]);代理和反馈:一个代理对象包括了访问一个特定对象的特定方法所需的信息.只要把它当成一个聪明的方法指针就行了.代理对象可以被移动到另一个地方,然后可以通过访问它来对已存在的方法进行类型安全的调用.一个反馈方法是代理的特例关键字用在将在事件发生的时候被当成代理调用的方法声明中.
内容声明:
1、本站收录的内容来源于大数据收集,版权归原网站所有!
2、本站收录的内容若侵害到您的利益,请联系我们进行删除处理!
3、本站不接受违法信息,如您发现违法内容,请联系我们进行举报处理!
4、本文地址:http://www.jujiwang.com/article/d34e829f85637ce82a50.html,复制请保留版权链接!
简介Java运行时环境,JRE,是Java应用程序运行和执行所需的软件组件,它包含Java虚拟机,JVM,,用于执行Java字节码,以及其他支持库和资源,JRE在跨平台环境中的可用性使其成为开发人员在各种操作系统上部署Java应用程序的宝贵工具,JRE的版本Oracle发布了两种类型的JRE,JDK附带的JRE,此JRE包含在Java...。
技术教程 2024-09-27 18:08:47
AndroidSDK是一个开发环境,它提供了开发和测试Android应用程序所需的一切工具,本指南将引导您一步一步地安装最新版本的AndroidSDK,包括Android12,先决条件具有至少8GBRAM和20GB可用磁盘空间的计算机具有至少Java8版本的Java运行时环境,JRE,步骤1,下载AndroidStudioAndroi...。
最新资讯 2024-09-27 09:34:30
简介在Java编程语言中,类是代码组织和管理的基本单位,类提供了封装性、抽象性和继承性,使程序员能够构建模块化、可重用和易于维护的应用程序,其中...。
本站公告 2024-09-25 16:25:08
概述Angular是一个用于构建Web应用程序和移动应用程序的开源、基于TypeScript的框架,它由Google开发和维护,最初于2010年发布,Angular是一个模块化框架,它允许开发人员使用组件来构建应用程序,组件是可重用的代码模块,它们表示应用程序界面的不同部分,Angular还提供了许多内置服务,包括路由、HTTP通信和...。
本站公告 2024-09-24 19:43:41
在编程中,了解如何准确测量字符串的字符和字节数至关重要,这有助于优化内存使用、提高性能并确保字符串处理任务的正确性,本文将指导您了解字符串测...。
技术教程 2024-09-15 04:46:22
高级用例,您可以创建用户体验出色、视觉上吸引人的网页布局,掌握position属性将使您能够构建响应迅速、交互良好的网站,让用户参与其中并留下深刻印象,...。
最新资讯 2024-09-14 14:49:28
简介Trim函数是一个强大的字符串操作函数,它可以从字符串中删除前导和尾随空白字符,它在各种编程语言和应用场景中都得到了广泛应用,精通Trim函数将使你能够,清除用户输入中的多余空格标准化文本数据以进行比较和处理提高字符串操作的效率和可靠性Trim函数的语法Trim函数的语法因编程语言而异,但其基本用法如下,trim,string,其...。
技术教程 2024-09-13 03:43:26
快速访问功能可以让您轻松返回页面的顶部,方便地查找信息,如何使用快速访问滚动到页面的任何位置,点击右下角的,返回顶部,按钮,该按钮将带您回到页面的顶部,快速访问的好处快速访问功能提供了以下好处,轻松返回页面顶部,不必再手动滚动返回页面顶部,节省时间和精力,方便查找信息,快速访问功能可以帮助您快速浏览页面,找到所需的信息,提高生产力,快...。
最新资讯 2024-09-10 16:36:50
序言网络通信是现代计算的重要组成部分,在UNIX操作系统中,网络编程是一个强大的工具,可以让我们创建和管理网络应用程序,本文将介绍UNIX网络编程的基础知识,从基础概念到高级技巧,第1章,网络基础1.1网络架构网络由计算机、交换机和路由器等设备组成,它们通过电缆或无线连接,计算机使用IP地址进行通信,就像邮寄信件时使用的物理地址一样,...。
互联网资讯 2024-09-10 09:59:30
什么是单片机,单片机是一种微型计算机,其所有的功能都集成在一块芯片上,它通常用于嵌入式系统中,用于控制各种电器设备和机器,什么是C语言,C语言是一种广泛用于单片机编程的高级编程语言,它以其高效的代码、广泛的库支持和可移植性而闻名,为什么使用C语言,高效的代码,C语言产生紧凑且高效的代码,这对于单片机等资源有限的系统至关重要,广泛的库支...。
互联网资讯 2024-09-10 08:14:08
在电子商务中,购物车是至关重要的组成部分,它使客户能够选择和购买商品,为了提供高效和无缝的购物体验,购物车代码必须与支付网关和物流服务无缝集成,支付网关集成支付网关是处理在线交易并确保安全付款的平台,在购物车中集成支付网关至关重要,因为它允许客户使用各种支付方式完成购买,支付网关集成涉及以下步骤,选择支付网关,有多种支付网关可用,重要...。
互联网资讯 2024-09-06 08:14:13
对于初学者来说,网站开发可能是一项艰巨且耗时的任务,但是,有了内容管理系统,CMS,,事情会变得简单得多,CMS是一种软件,可让您轻松创建、管理和更新网站内容,而无需复杂的编程知识,织梦CMS是国内最受欢迎的开源CMS之一,因其强大功能、易用性和广泛的可扩展性而备受推崇,在本教程中,我们将引导您完成织梦CMS源码下载和安装的详细步骤,...。
互联网资讯 2024-09-05 13:58:13