欢迎光临
我们一直在努力

<展现 C#> 第一章 C#简介(rainbow 翻译)

建站超值云服务器,限时71元/月

第一章 c# 简介

欢迎您加入c#的世界! 这一章将把您引进c#的天地,并回答一些相关的问题,如:您为什么要使用c#,c++和c#的主要有

什么不同点,以及为什么c#使开发更容易而且还使您感到很有趣。

为什么是另外一种编程语言?

必须回答的一个问题:当您已经使用c++或vb从事企业开发时,为什么还要学习另一种语言? 市场式的回答就是:"在企业

计算领域,c#将会变成为用于编写"下一代窗口服务"(next generation windows services,简写为ngws )应用程序的主要

语言。" 这一章将对用参数请求提供支持,并陈列了c#的一些功能。这一章会使您开胃的。

c#语言自c/c++演变而来。但是,它现代、简单、完全面向对象和类型安全。如果您是c/c++程序员,学习曲线将会很平

坦。许多c#语句直接借用您所喜爱的语言,包括表达式和操作符。假如不仔细看,简直会把它当成c++。

关于c#最重要的一点:它是现代的编程语言。它简化和现代化了c++在类、名字空间、方法重载和异常处理等领域。屏弃了

c++的复杂性,使它更易用、更少出错。

对c#的易用有贡献的是减少了c++的一些特性,不再有宏、模板和多重继承。特别对企业开发者来说,上述功能只会产生更

多的麻烦而不是效益。

使编程更方便的新功能是严格的类型安全、版本控制、垃圾收集(garbage collect)等等。所有的这些功能的目标都是瞄准

了开发面向组件的软件。

在继续呈现出更多的功能之前,我想停下来并在下面说明c#至关重要的各种要素。

简单

现代

面向对象

类型安全

版本控制

兼容

灵活

简单

c#具有c++所没有的一 个优势就是学习简单。该语言首要的目标就是简单。很多功能(还不如说是缺少了c++的一些功能)有

助于c#全方位的简单。

在c#中,没有c++中流行的指针。默认地,您工作在受管理的代码中,在那里不允许如直接存取内存等不安全的操作。我想

没有c++程序员可以声称,从没有使用指针访问过不属于他们的内存。

与指针"戏剧性"密切相关的是"愚蠢的"操作。在c++中,有::、.、和->操作符,它们用于名字空间、成员和引用。对于新

手来说,操作符至今仍是学习的一道难关。c#弃用其它操作符,仅使用单个操作符 "."。现在一个程序员所需要理解的就

是嵌套名字的注解了。

您不必记住基于不同处理器架构的隐含的类型,甚至各种整型的变化范围。c#使用统一的类型系统,屏弃了c++多变的类型

系统。这种系统充许您把各种类型作为一个对象查看,它是一个原始类型还是一个full-blown 类。和其它编程语言相比,

由于加框(boxing)和消框(unboxing)的机制,把简单类型当作对象处理并不能获得性能的改善。稍后将详细解释加框和消

框,但基本上仅当需要时才使用对象访问简单类型这种技术。

首先,老练的程序员可能不喜欢它,但是整型和布尔型如今终归是两种完全不同的数据类型。这就意味着原来if语句中错

误的赋值现在会被编译出错,因为if语句只接受布尔类型的值。再也不会出现误用赋值符为比较符这样的错误!

c#同时也解决了存在于c++中已经有些年头的多余东西(redundancies)。这种多余包括常数预定义,不同字符类型等。鉴于

多余表单已经从该语言中消失,故一般在c#中都可以使用表单了。

现代

您投入学习c#的努力是一笔大投资,因为c#是为编写ngws 应用程序的主要语言而设计。您 将会发现很多自己用c++可以实

现或者很费力实现的功能,在c#中不过是一部分基本的功能而已。

对于企业级的编程语言来说,新增的金融数据类型很受欢迎。您用到了一种新的十进制数据类型,它专用于金融计算方

面。如果不喜欢这种现成简单的类型,根据您应用程序的特殊需求,可以很容易地创建出新的一种数据类型。

我已经提到,指针不再是您编程武器的一部分。不要太惊讶,全面的内存管理已经不是您的任务。运行时ngws提供了一个

垃圾收集器,负责c#程序中的内存管理。因内存和应用程序都受到管理,所以很必要增强类型安全,以确保应用的稳定

性。

对于c++程序员,异常处理的切不是新的东西,但它是c#的主要功能。c#的异常处理与c++的不同点在于它是交叉语言的(运

行时的另一个功能)。在没有c#之前,您必须处理怪异的hresults,但现在由于使用了基于异常的健壮的出错处理, 这一

切都 结束了。

对于现代的应用程序,安全是首要的,c#也不会例外。它提供了元数据语法,用于声明下述ngws安全模式的能力和许可。

元数据是ngws运行时的一个关键的概念,下一章将涉及到它更深的含义。

面向对象

您不会预料一种新语言不支持面向对象的功能吧? c#当然支持所有关键的面向对象的概念,如封装、继承和多态性。完整

的c#类模式构建在ngws运行时的虚拟对象系统(vos,virtual object system)的上层,vos将在下章描述。对象模式只是基

础的一部分,不再是编程语言的一部分。

您一开始必须关注的事,就是不再有全局函数、变量或者是常量。所有的东西都封装在类中,包括事例成员(通过类的事

例–对象可以访问)或都静态成员(通过数据类型)。这些使c#代码更加易读且有助于减少潜在的命名冲突。

定义类中的 方法默认是非虚拟的(它们不能被派生类改写)。主要论点是,这样会消除由于偶尔改写方法而导致另外一些原

码出错。要改写方法,必须具有显式的虚拟标志。 这种行为不但缩减速了虚拟函数表,而且还确保正确版本的控制。

使用c++编写类,您可以使用访问权限(access modifiers) 给类成员设置不同的访问等级。c#同样支持private、

protected 和public 三种访问权限 ,而且还增加了第四种:internal。有关访问权限 的详细情况将在第五章 "类" 中说

明。

您曾经创建了多少个类是从多基类派生出来的(atl 程序员,您的投票不计在内!) ? 大多数情况,仅需从一个类派生

出。多基类惹出的麻烦通常比它们解决的问题还多。那就是为什么c#仅允许一个基类。如果您觉得需要多重继承,可以运

用接口。

一个可能出现的问题:在c#中不存在指针,如何模仿它? 这个问题的答案很有代表性,它提供了对ngws运行时事件模式的

支持。再次,我将把对它的全面解释放到第五章。

类型安全

我再次选指针作为一个例子。在c++中拥有一个指针,您能自由地把它强制转换成为任何类型,包括干出诸如把一个int*

(整型指针)强制转换成一个double *(双精度指针)这样的傻事。只要内存支持这种操作,它就"干过"。这并不是您所想象

的企业级编程语言的类型安全。

纲要性的问题,,c#实施最严格的类型安全,以保护自己及垃圾收集器(garbage collector)。所以必须遵守c#中一些相关

变量的规则:

您 不能使用没有初始化的变量。对于对象的成员变量,编译器负责清零。而局部变量,则由您负责清零。当您使用一个没

有初始化的变量时,编译器会教您怎么做。优点是能够避免由于使用不经初始化的变量计算结果而导致的错误,而您还不

知道这些奇怪的结果是如何产生的。

c#取消了不安全的类型转换。不能把一个整型强制转换成一个引用类型(如对象),而当向下转换时,c#验证这种转换是正

确的。(也就是说,派生类真的是从向下转换的那个类派生出来的。)

边界检查是c#的一部分。再也不会出现这种情况:当数组实际只定义了n-1个元素,却超额地使用了n个元素。

算术运算有可能溢出终值数据类型的范围。c#允许在语句级或应用程序级检测这些运算。在允许检测溢出的情况下,当溢

出发生时将会抛出一个异常。

在c#中,被传递的引用参数是类型安全的。

版本可控(versionable)

在过去的几年中,几乎所有的程序员都至少有一次不得不涉及到众所周知的"dll地狱"。该问题起因于多个应用程序都安装

了相同dll名字的不同版本。有时,老版本的应用程序可以很好地和新版本的dll一起工作,但是更多的时候它们会中断运

行。现在的版本问题真是令人头痛。

就象您将在第八章"用c#写组件"所看到的,ngws runtime 将对您所写的应用程序提供版本支持。c#可以最好地支持版本控

制。尽管c#不能确保正确的版本控制,但是它可以为程序员保证版本控制成为可能。有这种支持,一个开发人员就可以确

保当他的类库升级时,仍保留着对已存在的客户应用程序的二进制兼容。

兼容

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进行内部操作的

一些例子。

灵活

上一部分的最后一段有可能提醒了程序员。您可能会问:"难道就没有我要传递指针的api吗?" 您是正确的。不是仅有少数

的这种api,而是很多(有点保守的估计)。这种对原始win32代码的访问有时导致对非安全类指定指针的使用(尽管它们中的

一些由于受com和pinvoke的支持可以解决)。

尽管c#代码的缺省状态是类型安全的,但是您可以声明一些类或者仅声明类的的方法是非安全类型的。这样的声明允许您

使用指针、结构,静态地分配数组。安全码和非安全码都运行在同一个管理空间,这样暗示着当从安全码调用非安全码时

不会陷入列集(marshaling)。

小结

c#语言从c和c++演变而来,它是给那些愿意牺牲c++一点底层功能,以获得更方便和更产品化的企业开发人员而创造的。c#

现代、简单、面向对象和类型安全。尽管它借鉴了c和c++的许多东西,但是在一些诸如名字空间、类、方法和异常处理等

特定领域,它们之间还存在着巨大的差异。

c#为您提供了方便的功能,如垃圾收集、类型安全、版本控制,等等。仅有的"代价"就是,代码操作默认是类型安全的,

不允许指针。光是类型安全就可以搞定了。但是,如果您需要指针,仍可以通过非安全码使用它们,而且当调用非安全码

时,不能含有列集。

赞(0)
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com 特别注意:本站所有转载文章言论不代表本站观点! 本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。未经允许不得转载:IDC资讯中心 » <展现 C#> 第一章 C#简介(rainbow 翻译)
分享到: 更多 (0)