姓名:于川皓 学号:16140210089
转载自:http://blog.sina.com.cn/s/blog_6cd824cd0102w78e.html
【嵌牛导读】:C#是一种能够广泛应用的编程语言,那么它有什么特点呢?
【嵌牛鼻子】:编程语言,程序设计
【嵌牛提问】:C#语言的优点,缺点分别是什么?
【嵌牛正文】:写C#的人以前就是Borland 的 Anders Hejlsberg,C#的架构者,可以说是Delphi之父.
C#语言自C/C++演变而来。但是,它现代、简单、完全面向对象和类型安全。如果您是C/C++程序员,学习曲线将会很平坦。许多C#语句直接借用您所喜爱的语言,包括表达式和操作符。假如不仔细看,简直会把它当成C++。
C#不仅仅是一门语言, C#更多的是它背后所依附的.Net平台。C#完全就是为.Net而生,他的许多特性只有在.net中才能发挥威力。C#之于.NET,就像Java之于Java类库,Object Pascal之于VCL一样(不管你爱不爱听,Object Pascal确实已经沦为了VCL的专用实现语言了,它里面有很多特性都是为了更好的实现VCL而添加的)。
C++则是一门语言,而且只是一门语言,它有一个标准库STL,但STL本身却不能帮助你实现任何平台相关的东西。那一切需要你自己去做。也正因为如此,C++没有被捆绑在任何专用平台和专用领域,它作为一门语言,可以作几乎所有的事情,只要你给它一个合适的平台。
拿一个平台和一门语言比,本身就不公平。而且,也不存在谁好谁坏的问题。如果你需要在特定领域开发,那么,象.net这样的平台可以帮你省下不少心思,如果你想不局限于一个平台,那么,单纯只是一门语言的C++则会让你心服口服。
至于C++ Builder(我们不如说是VCL,拿框架跟框架比更公平些),本身VCL和.NET都出自同一人之手,我们应该想到他们的本质差别不会很大。但是,作为后来者的.NET,一定会加入一些新的东西使得自己更加强大。
但是在我看来,.NET无论如何显得太年轻了一些,也许以后他会无处不在,但不是现在。
优点:
关于C#最重要的一点:它是现代的编程语言。它简化和现代化了C++在类、名字空间、方法重载和异常处理等领域。屏弃了C++的复杂性,使它更易用、更少出错。
对C#的易用有贡献的是减少了C++的一些特性,不再有宏、模板和多重继承。特别对企业开发者来说,上述功能只会产生更多的麻烦而不是效益。使编程更方便的新功能是严格的类型安全、版本控制、垃圾收集(garbage collect)等等。所有的这些功能的目标都是瞄准了开发面向组件的软件。
在继续呈现出更多的功能之前,我想停下来并在下面说明C#至关重要的各种要素。
简单 , 现代 ,面向对象 ,类型安全 ,版本控制 ,兼容,灵活
1.简单
C#具有C++所没有的一个优势就是学习简单。该语言首要的目标就是简单。很多功能(还不如说是缺少了C++的一些功能)有助于C#全方位的简单。
在C#中,没有C++中流行的指针。默认地,您工作在受管理的代码中,在那里不允许如直接存取内存等不安全的操作。我想没有C++程序员可以声称,从没有使用指针访问过不属于他们的内存。
与指针"戏剧性"密切相关的是"愚蠢的"操作。在C++中,有::、.、和->操作符,它们用于名字空间、成员和引用。对于新手来说,操作符至今仍是学习的一道难关。C#弃用其它操作符,仅使用单个操作符 "."。现在一个程序员所需要理解的就是嵌套名字的注解了。
您不必记住基于不同处理器架构的隐含的类型,甚至各种整型的变化范围。C#使用统一的类型系统,屏弃了C++多变的类型系统。这种系统充许您把各种类型作为一个对象查看,它是一个原始类型还是一个full-blown 类。和其它编程语言相比,由于加框(boxing)和消框(unboxing)的机制,把简单类型当作对象处理并不能获得性能的改善。稍后将详细解释加框和消框,但基本上仅当需要时才使用对象访问简单类型这种技术。
首先,老练的程序员可能不喜欢它,但是整型和布尔型如今终归是两种完全不同的数据类型。这就意味着原来if语句中错误的赋值现在会被编译出错,因为if语句只接受布尔类型的值。再也不会出现误用赋值符为比较符这样的错误!
C#同时也解决了存在于C++中已经有些年头的多余东西(redundancies)。这种多余包括常数预定义,不同字符类型等。鉴于多余表单已经从该语言中消失,故一般在C#中都可以使用表单了。
2.现代
您投入学习C#的努力是一笔大投资,因为C#是为编写NGWS 应用程序的主要语言而设计。您将会发现很多自己用C++可以实现或者很费力实现的功能,在C#中不过是一部分基本的功能而已。对于企业级的编程语言来说,新增的金融数据类型很受欢迎。您用到了一种新的十进制数据类型,它专用于金融计算方面。如果不喜欢这种现成简单的类型,根据您应用程序的特殊需求,可以很容易地创建出新的一种数据类型。
我已经提到,指针不再是您编程武器的一部分。不要太惊讶,全面的内存管理已经不是您的任务。运行时NGWS提供了一个垃圾收集器,负责C#程序中的内存管理。因内存和应用程序都受到管理,所以很必要增强类型安全,以确保应用的稳定性。
对于C++程序员,异常处理的切不是新的东西,但它是C#的主要功能。C#的异常处理与C++的不同点在于它是交叉语言的(运行时的另一个功能)。在没有C#之前,您必须处理怪异的HRESULTs,但现在由于使用了基于异常的健壮的出错处理,这一切都结束了。
对于现代的应用程序,安全是首要的,C#也不会例外。它提供了元数据语法,用于声明下述NGWS安全模式的能力和许可。元数据是NGWS运行时的一个关键的概念,下一章将涉及到它更深的含义。
3.面向对象
您不会预料一种新语言不支持面向对象的功能吧? C#当然支持所有关键的面向对象的概念,如封装、继承和多态性。完整的C#类模式构建在NGWS运行时的虚拟对象系统(VOS,Virtual Object System)的上层,VOS将在下章描述。对象模式只是基础的一部分,不再是编程语言的一部分。
您一开始必须关注的事,就是不再有全局函数、变量或者是常量。所有的东西都封装在类中,包括事例成员(通过类的事例--对象可以访问)或都静态成员(通过数据类型)。这些使C#代码更加易读且有助于减少潜在的命名冲突。
定义类中的方法默认是非虚拟的(它们不能被派生类改写)。主要论点是,这样会消除由于偶尔改写方法而导致另外一些原码出错。要改写方法,必须具有显式的虚拟标志。这种行为不但缩减速了虚拟函数表,而且还确保正确版本的控制。
使用C++编写类,您可以使用访问权限(access modifiers) 给类成员设置不同的访问等级。C#同样支持private、protected 和public 三种访问权限,而且还增加了第四种:internal。有关访问权限。
您曾经创建了多少个类是从多基类派生出来的(ATL 程序员,您的投票不计在内!) ? 大多数情况,仅需从一个类派生出。多基类惹出的麻烦通常比它们解决的问题还多。那就是为什么C#仅允许一个基类。如果您觉得需要多重继承,可以运用接口。
一个可能出现的问题:在C#中不存在指针,如何模仿它? 这个问题的答案很有代表性,它提供了对NGWS运行时事件模式的支持。再次,我将把对它的全面解释放到第五章。
4.类型安全
我再次选指针作为一个例子。在C++中拥有一个指针,您能自由地把它强制转换成为任何类型,包括干出诸如把一个int*(整型指针)强制转换成一个double *(双精度指针)这样的傻事。只要内存支持这种操作,它就"干过"。这并不
您正在看的asp教程是:展现C#(1)C#介绍。是您所想象的企业级编程语言的类型安全。
纲要性的问题,C#实施最严格的类型安全,以保护自己及垃圾收集器(garbage collector)。所以必须遵守C#中一些相关变量的规则:您不能使用没有初始化的变量。对于对象的成员变量,编译器负责清零。而局部变量,则由您负责清零。当您使用一个没有初始化的变量时,编译器会教您怎么做。优点是能够避免由于使用不经初始化的变量计算结果而导致的错误,而您还不知道这些奇怪的结果是如何产生的。
C#取消了不安全的类型转换。不能把一个整型强制转换成一个引用类型(如对象),而当向下转换时,C#验证这种转换是正确的。(也就是说,派生类真的是从向下转换的那个类派生出来的。)
边界检查是C#的一部分。再也不会出现这种情况:当数组实际只定义了n-1个元素,却超额地使用了n个元素。
算术运算有可能溢出终值数据类型的范围。C#允许在语句级或应用程序级检测这些运算。在允许检测溢出的情况下,当溢出发生时将会抛出一个异常。在C#中,被传递的引用参数是类型安全的。
5.版本可控(Versionable)
在过去的几年中,几乎所有的程序员都至少有一次不得不涉及到众所周知的"DLL地狱"。该问题起因于多个应用程序都安装了相同DLL名字的不同版本。有时,老版本的应用程序可以很好地和新版本的DLL一起工作,但是更多的时候它们会中断运行。现在的版本问题真是令人头痛。
就象您将在第八章"用C#写组件"所看到的,NGWS runtime 将对您所写的应用程序提供版本支持。C#可以最好地支持版本控制。尽管C#不能确保正确的版本控制,但是它可以为程序员保证版本控制成为可能。有这种支持,一个开发人员就可以确保当他的类库升级时,仍保留着对已存在的客户应用程序的二进制兼容。
6.兼容
C#并没有存在于一个封闭的世界中。它允许使用最先进的NGWS的通用语言规定(Common Language Specification,简写为CLS)访问不同的API。CLS规定了一个标准,用于符合这种标准的语言的内部之间的操作。为了加强CLS的编译,C#编译器检测所有的公共出口编译,并在通不过时列出错误。
当然,您也想能够访问旧一点的COM对象。NGWS运行时提供对COM透明的访问。如何集成原来的代码将在第10章"非管理代码的内部操作"有介绍。
OLE 自动化是一种特殊的动物。任一个使用C++创建OLE自动化项目的人已经喜欢上各种各样的自动化数据类型。有个好消息就是C#支持它们,而没有烦锁的细节。
最后,C#允许您 用C 原型的API进持内部操作。可以从您的应用程序访问任何DLL中的入口点(有C的原型)。用于访问原始API的功能称作平台调用服务(Plaform Invocation Services ,缩写PInovke),第10章将展示使用C API进行内部操作的一些例子。
7.灵活
上一部分的最后一段有可能提醒了程序员。您可能会问:"难道就没有我要传递指针的API吗?" 您是正确的。不是仅有少数的这种API,而是很多(有点保守的估计)。这种对原始WIN32代码的访问有时导致对非安全类指定指针的使用(尽管它们中的一些由于受COM和PInvoke的支持可以解决)。
尽管C#代码的缺省状态是类型安全的,但是您可以声明一些类或者仅声明类的的方法是非安全类型的。这样的声明允许您使用指针、结构,静态地分配数组。安全码和非安全码都运行在同一个管理空间,这样暗示着当从安全码调用非安全码时不会陷入列集(marshaling)。
8. 小结
C#语言从C和C++演变而来,它是给那些愿意牺牲C++一点底层功能,以获得更方便和更产品化的企业开发人员而创造的。C#现代、简单、面向对象和类型安全。尽管它借鉴了C和C++的许多东西,但是在一些诸如名字空间、类、方法和异常处理等特定领域,它们之间还存在着巨大的差异。
C#为您提供了方便的功能,如垃圾收集、类型安全、版本控制,等等。仅有的"代价"就是,代码操作默认是类型安全的,不允许指针。光是类型安全就可以搞定了。但是,如果您需要指针,仍可以通过非安全码使用它们,而且当调用非安全码时,不能含有列集。
缺点
虽然用C#编程简单了!
可是用C#编写的程序必须运行在.NET平台。
但是现在的用户机器上大部分是没安装.NET平台。
也就是用C#编写的程序大部分用户是不能用的!
也许微软的新操作系统出来了就可以了!
微软对C#和.NET介绍中的一些有趣的漏洞。MSIL是.NET提供的一个新特性,允许很流行的程序设计语言编译到一个单独的公用语言。(.NET支持的语言种类是相当惊人的)。这些语言都要服从一种叫“通用语言规范(CLS)”的构架。微软称之为“CLS兼容语言和类库之间可互操作的通用语言”。
编译所有的语言到一个单一的公用语言上,能让“继承”通过多重语言真正执行。这轻而易举的扫除了C#可能遇到的错误概念。.NET组件使用COM的IDispatch,它只允许接口执行。它比先前C#被评定为一种OOP语言的看法容易接受得多。它在程序设计上或许像Java一样是面向对象的。
但不幸的是CLS这种包括MSIL的共享语言基础,只让RAD开发者受益,而损害了硬件的核心开发者,有人认为创造一种新程序设计语言的目的就是有能力充分运用它和服务于可微调的执行能力,这一点在CLS世界里是做不到的。老实说,加速充分利用从来不是许多语言的唯一目标。许多语言的唯一目标(最瞩目的是像Visual Basic和Java的RAD语言)是加速和美化开发和展开能力,而不仅仅是运行时刻的速度。
舒密特文章中所提到的确实包含了相关和值得注意的评论:你可以用C++指定.NET,并在你的代码中运用所有C++特性。同时,因为.NET在运行时刻不能检验C++代码是否安全,此语言并不遵从CLS规范,里面所书写的程序也受到限制。作为应对,微软往Visual C++里添加非标准管理的扩展。用这些扩展写的代码能符合CLS规范。
C#将把微软领向何方就一目了然了。因为所有项目编写会只依靠MSIL和CLS JIT编译程序。这样C#或任何MSIL前端语言比Java任何时候都快。但很不幸,程序设计和编译程序级的优化不能在非微软的平台上充分利用,想在非Windows平台上展开.NET,再充分运用它们也是不现实的。
JAVA是C#的竞争对手 尽管.NET是微软一手缔造的,它并不是只能在Windows上使用。微软准备尽力为那些COM对象提供传统帮助(所有的OLE, ActiveX等等在下一代Viual Studio推出后,都将成为一个legacy平台)。但.NET不会围绕COM建造。新平台无疑将补充COM,并与它几乎天衣无缝地配合,但一点也不会依靠COM。这表明这种结构本身能够Macintosh, UNIX. BeOX展开。这样命名,是因为除了CLS构架是平台独立的,C#将用到的和所有遵从CLS的数据库也是平台独立的。也就是说,它们都是遵从CLS的,如果一个本机MSIL编译程序在平台上有效,那么它们能在运行时刻为任何结构进行编译。微软也积极争取被ECMA标准接纳,他们先前的Javascript已被接纳。当Visual Studio. NET推出时,开发团体肯定会有不同的反应。"微软又开发了一个新平台",这已吓倒那些本来对微软平台统治忧心忡忡的人了。然而更重要的是C#或.NET战略不会对原始C++构成太大威胁,那么有理由推论C#和.NET将是Java的有力竞争者。考虑相反方面:Java VM靠翻译字节码来运行应用程序。CLS在运行时刻本机编译。Java平台只支持Java语言。.NET只支持MSIL,但一些无限制的高级语言如C#,Visual Basic,甚至Eiffel和COBOL都能启动MSIL。Java运用执行转接提供真正的OOP技术。
MSIL,C#也是如此。在Java平台,简单地移动平级文件,项目就可以展开为产品目录。据说,.NET平台的项目也可轻松展开而不像以registry-happy Com为基础的项目。或许Java平台真正的优势只在于政治上的正确性--它不是微软搞出来的,且目前有成千上万的执着的宗教追随者。
(引:一位VB程序设计师的个人看法)虽然我很了解Java和C#,我仍被冠以高级Visual Basic程序设计师的称号。人们会认为我这样一个VB设计师将是反对微软的偏执狂。但我也得面对现实。老实说:VB是一个RAD开发工具。别只顾着精美,别记着真正的对象。迅速得到结果才是重中之重。在商业世界里,纯粹的技术和结果不总是能相吻合的,短期结果往往胜过长期生产力。这是不幸的,但在许多公司中,这却是事实。这些公司就是C#的主要用户。我会使用C#吗?当然会用!我现在使用Visual Basic,但转入C#有何不好?我更欣赏Java和OOP语言的精美,但因为我进行的所有项目中,短期成果一直胜过长期成果,我已没有时间去考虑替换Windows平台。但如从纯技术和信仰角度来说,Java和C++的程序设计师就有足够理由关注C#,这是微软维持垄断的又一招。
最后,C#是好还是不好?那么,因为这里的“继承”指对接口界面的再执行,所以,它不是真正的OOP。如果你是微软,亦或如果你依靠微软技术而不准备切换平台,那C#是很棒的,并将为VB程序设计师们搬运Java和C++上的技巧提供很好的基础(因为语法是共享的)。但因为微软将全力推出C#,所以,Java和C++的拥护者们肯定会设计出新的语言,予以还击。同时,C#不一定可转移到其他平台,也不能真正体现OOP的价值,甚至对OOP的初学者有害无益。