1、C# 编程语言概述 1. C,C+,C#的历史 C#程序语言是建立在 C 和 C+程序语言的精神上的。这个账目有着很有力的特征和易学的曲线。不能说 C#与 C 和 C+相同,但是因为 C#是建立在这两者之上,微软移除了一些成为更多负担的特征,比如说指针。这部分观看 C 和 C+,在 C#中追踪它们的发展。 C 程序语言原本是被定义在 UNIX 操作系统中的。过去经常编写一些 UNIX 的应用程序,包括一个 C 编译器,最后被用于写 UNIX 自己。它普遍认可在这个学术上的竞争扩展到包含这个商业的世界,脑上。最初的 Windows API 被定义 与使用 C同 Windows 代码一起工作,并且
2、直到今天至少设置核心的 Windows 操作系统 APIS保持 C 编译器。 来自一个定义的观点, C 缺乏一个细节就像 Smalltalk 这类语言也包含的一样,一个对象的概念。你将会学到更多的关于对象的内容在第八章“写面向对象的代码”一个对象作为一个数据的收集并且设置了一些操作,代码可以被 C 来完成,但是对象的观念并不能被强制出现在这个语言中。如果你想要构造你的代码使之像一个对象,很好。如果你不想这么做, C 也确实不会介意。对象并不是一个固有的部分在这门语言中,很多人并没有花很大的经 历在这个程序示例中。 当面向对象的观点的发展开始得到认可之后,思考代码的方法。 C+被开发出,包含了这
3、种改良。它被定义去兼容 C(就像所有的 C 程序同样也是 C+程序,并且可以被 C+编译器编译) C+语言主要的增加是提供这种新的概念。 C+又额外提供了的类(对象的模板)行为的衍生。 C+语言是 C 语言之上的改良体,不熟悉的不常用的语言上,例如 VB, C 和C+是很底层的,而且需要你错大量的编码来使你的应用程序很好的运行。理和错误检查。和 C+可以处理在一些非常给力的应用程序中,码工作的很流畅。被设定的目标 是保持对 C 的兼容, C+不能够打破 C 的底层特性。 微软定义的 C#保留了很多 C 和 C+的语句。码并且能想对快地识别代码。对于 C#来说一个很大的优势是它的设计师并没有让它
4、去兼容 C 和 C+。当这看起来或许是个错误的处理时,事实上是一个好消息。 C#剔除了一些使得 C 和 C+工作起来很困难的东西。始怪癖和在 C 中发现的缺陷。 C#正在开始一个清洁的石板并且没有任何兼容需求。因此它能够保持前辈的强项并且丢弃使得 C 和 C+程序生存困难的弱点 2. 引进 C# C#这门在 .NET 体系中被引进的全新语言,是从 C+衍生出来的。然 而, C#是一门流行的,面向对象的(从头到尾)类型安全的语言。 语言特征 下面的部分提供了一个快速的视角关于 C#语言的一些特征。如果它们中的某些概念对你来说很陌生,不要着急,所有的东西都将在后续章节中详细说明。 类 在 C#中,
5、所有的代码和数据都必须被附在一个类中。你不能在类外定义一个变量,同样的你也不能写任何不在类中的代码。当一个类的对象被创建并且运行时,类就被构造了。当类的对象被释放时,类也就被销毁了。类提供了单继承,所有的类最终从基类获取的东西就是对象。随着时间的推移, C#提供了有版本的技术去帮助 你的类的形成来保养代码的兼容当你使用你更早期的类的代码的时候。 下面让我们来看一个叫做 Family 的类的例子。这个类包含了两个静态的域来保存家庭成员的第一个名字和最后一个名字。同样的,有一个方法来返回家庭成员的全名。 class Class1 public string FirstName; public st
6、ring LastName; public string FullName() return FirstName + LastName; 注:单继承意 味着一个 C#类只能从一个基类中继承。 C#是你能够打包你的类放到一个被称作 namespace 类的集合里面。并且可以在逻辑聚合 上帮助安排类 的收集。当你 开始学习 C#的时候,很 明显所有的namespace 都是和 .NET 类型的系统相关的。微软同样选择包含了一些类辅助于兼容以前的代码和 API 的通道。这些类同样包含在微软的 namespace 中。 数据类型 C#让你使用两种类型的数据工作:值类型和引用类型。值类型保存实际的值。引
7、用类型保存实际的值储存在存储器别处的位置。原始的数据类型,例如字符型,整型,浮点型 ,枚举型还有结构体类型,这些都是值类型。而对象和数组类型被处理成了引用类型。 C#预定义了引用类型(对象和字符串)新,字节,无符号短整型,无符号整型,无符号长整型,浮点型,双精度浮点型,布尔型,字符型和小数类型)的值类型和引用类型最终都会被一个基本类型的对象执行。 C#同样允许你将一个值或者一个类型转变为另外一个值或一种类型。你可以使用隐式的转换策略或者显式的转换策略。隐式的转换策略总是成功并且并不丢失任何信息(例如,你可以将一个整型转换为一个长整型而不用丢失任何信息因为长整型比整型长)换策略可能会是你丢失一
8、些数据丢失因为长整型可以比整型保留更多的值)转换发生。 前后引用 参考第三章“同变量一起工作”来找到更多的关于显式和隐式转换策略的信息。 你可以同时使用单维和多维的数组在 C#中。多维数组能够变成一个矩阵。当这个矩阵与多维数组有相同的面积大小。或者参差不齐的,当有些数组有不一样的面积大小。 类和结构体可以拥有数据成员被称为属性和字段。变量。你可以定义一个叫做Employee的结构体,例如,有一个被称作 Name的域,如果你定 义 了 一 个 Employee类 型 的 变 量 叫 做 CurrenrEmployee , 你 可 以 通 过 写CurrentEmployee.Name 取回这些雇
9、员的名字。码赋值之后什么应该发生。如果雇员的名字必须被一个数据库读,例如,你可以写一个代码 “当一些人询问名字属性的值时,从数据库中读名字,并且返回这个名字用 string 类型” 函数 一个函数是一种可以随时使用的代码,代码。一个函数的例子将会像 FullName函数更早的展示的那样,在这一章中,在 Family 类中。一个函数通常会联合一些返回信息的代码,而一个方法通常不返回信息。然而对于我们而言,我们一般都会把它们都归结于函数 。 函数可以拥有四种参数: 输入的参数有值传递到函数内,但是函数无法改变它们的值。 输出的参数没有值当他们被传递给函数时, 但是函数可以给它们值并且将这个值传回给
10、它的调用者。 , 引用参数通过引用传递另外的一个值。它们有一个值进入函数,并且这个值可以在函数中被更改。 参数参数在列表中定义了一个数组变量。 C#和 CLR 一同工作来提供自动的存储管理。或者“留足够的空间让这个对象使用”这样的代码。 CLR 监视你的内存使用并且自动的取回更逗当你需要它的时候。圾回收而著名) C#提供了大 量的运算符使得你能够写大量的数学和逐位运算的表达式。他们当中的大量(并不是所有)运算符可以被重新定义,是你能够改变这些运算符的工作。 C#提供了一个长的报表的清单是你能够定义各种各样的处理路径通过你的代码。通过报表的操作,使用关键字,就像 switch,while,for
11、,break 和 continue 能够使你的代码根据变量值的不同分入到不同的路径中。 类能够包含代码和数据。每一个成员对其他对象的可见性。 C#提供了 public,protected, internal, protected internal 和 private 这些可接近的范围。 变量 变量可以被定义为常量。常量有固定的值并且你的代码执行过程中不能被改变,这个 PI 的值,例如,是一个很好的常量的例子,因为她得值将不会被改变在你的代码运行过程中。枚举类型详细的定义了一种有关常量的名称。例如,你可以定义一个枚举类型的行星使用值为 Mercury V 在你的代码中。如果你使用一个变量去表示行
12、星的时候,用这个枚举类型的 names 可以使你的代码变的更易读。 C#提供了一个嵌入式的机制去定义和处理一些事件。如果你写了一个类执行了很漫长的操作,你或许想调用一个事件,当 这个事件结束的时候,客户可以签署这个时间并且抓住这个事件在他们自己的代码中,他可以让他们被通知当你完成了这个漫长的预算,这个事件处理机制在 C#中使用了委托,一个引用函数的变量。 注:事件处理是一个在你代码中的程序,当一个时间发生时它决定了什么动作将会发生。 例如用户点击了一个按钮。如果你的类保存了一个值,写一些叫做分度器的代码是你的类可以被访问就好像它是一个数组。假定你写了一个叫做 Rainbow 的类,例如,它包含
13、了一套颜色在这个彩虹中。访问者或许想要些 MYRainbow0来取出在彩虹中的第一个颜色。你 可以写一个分度器在你的 Rainbow 类中来定义什么将会被返回当这个访问者访问你的类时,就好像它是一个值的数组。 接口 C#提供了接口,它聚集了属性,方法,和阐述一套功能的事件。 C#的类可以执行接口,它通过接口告诉使用者这个类提供的一整套功能文件。何现有的代码,它能尽可能少的兼容问题。曾经有一个接口被公开了,它不能被改变,但是它能够通过继承来进化。 C#的类能够执行许多接口,即使这个类只能从一个基类继承。 让我们看一个现实世界的 C#中有利于举例说明接口的非常明确的规则的例子。许多应用程序尅使用今
14、天提供的添 加项。执行的时候有读取添加项的能力。要做这些,这个添加项必须遵守一些规则。 DLL 添加项必须展示一个叫 CEEntry 的函数。并且必须使用 CEd 作为 DLL 文件名的开头。当我们运行我们的代码时,它可以扫描正在工作的以 CEd 开头的所有 DLL 的目录。当它发现了一个,就被读取下来。然后它用 GetProcAddress 来找出 DLL 中的 CEEntry 函数。由此证明你服从所有的规则去建立一个添加项是必要的。这种创建读取添加项是必要的,因为它担负了更多的不必要的代码责任。如果我们使用一个接口在这个例子中,你的 DLL 添加项可以应 用于一个接口。由此保证所有必须的方
15、法,属性和事件出现在 DLL 中,和作为文件指定的函数。 属性 属性声明了额外的信息关于你的类对于 CLR。在过去,如果你想要自己描述你的类,你不得不用一些分散的途径在存放在外部的文件中,例如 IDL或者事件的 HTML文件。通过你的努力,属性解决了这个问题,这个发展者,约束了一些信息在类中,任何种类的信息,例如,在类中,定义它怎么行动当它被用到的时候。可能性是没完没了的,这也是为什么微软会包含很多预定义的属性在 .NET 结构里。 编译 C# 运行你的 C#代码通过 C#编译器产生了两类重要的信息:代码和元数据。接下来的部分描述了这两种主题并且完成了建立在 .NET 代码上的一块二进制的审查
16、,那就是汇编。 微软中间语言( MSIL) 被 C#编译器输出的代码是写在一种叫做微软中间语言中的。 MSIL 是用来构造一套详细的说明来指导你怎样执行的你的代码。它包含了操作的说明,例如变量的初始化,唤起对象的方法,错误处理以及声明一些新的东西。 C#并不仅仅是一种在编写过程中变化的来自 MSIL 源代码的语言。所有的 .NET 兼容的语言,包括 VB.NET 和C+管理,当它们的 源代码编译完成后产生了 MSIL。所有的 .NET 语言都是用相同的运行时间,所以来自不同语言的和不同编译器的代码可以很方便地在一起工作。 对于物理 CPU 而言, MISL 并不是一套明确的指令。它不知道任何关
17、于你机器 CPU的事,同样的你的机器也不知道任何有关 MSIL 的事。那么,当你的 CPU 不能读取MSIL 的时候,说明代码中。这个击沉被称作恰好够用编写,或者 JIT。 JIT 编译器的工作是翻译你的普遍性的 MSIL 代码给机器以便 CPU 可以执行你的代码。 你也许想知道在进程中一个额外的步骤是什么样的。当一个编译器可以立刻产生 CPU 解释的代码是为什么 MSIL 产生了?终究,编译器总之在之后做了这些。这里有很多引起这个的原因。首先, MSIL 使你能够较容易的编写代码当它移动到一个不同的硬件中。假设你已经写了一些 C#代码,并且你想让它同时运行在你的台式机和手提设备上。非常有可能
18、的是这两种设备有着不同的 CPU。如果你只有一个 C#编译器其目标是一个明确的 CPU,那么你就需要两个 C#编译器:一个的目标是台式机的CPU,另一个的目标是手提设备的 CPU。你不得不编译你的代码两次,以确保你的正确代码使用在了正确的设备上。有了 MSIL,你只用编写一 次。安装了 .NET 结构在你的台式机里,它包含了一个 JIT 编译器用来翻译你的 MSIL 中的 CPU 特定代码给你的机器。安装了 .NET 结构在你的手提设备中,它包含了一个 JIT 编译器用来翻译同样的 MSIL 中的 CPU 特定代码给你的手提设备。以运行在任何拥有 .NET JIT 编译器的设备上的 MSIL
19、基本代码。 你现在仅仅有一个可以运行在任何拥有 .NET JIT 编译器的设备上的 MSIL基本代码在这些设备上的 JIT编译器能够照顾你的代码使他们运行的很顺利。 另外一个编译器使用 MSIL 的原因是指令的设置能够很容易地被一个认证近 程读取。编译器的一部分工作就是核实你的代码以确保它能够尽可能的清晰。正确地访问内存,型时。这些检查确保了你的代码不会执行任何能够使你代码崩溃的指令。MSIL 指令设置定义使得这个检查进程想对地易懂。 CPU 特定指令设置是为了快速执行代码而优化的。但是它们使得代码难以被阅读,也因此很难被检查。有一个可以立刻输出 CPU 特定代码的 C#编译器能够使代码的检查
20、很困难或者甚至不可能。允许 .NET结构的 JIT编译器核实你的代码以确保你的代码通过一个漏洞很大的路径访问内存并且变量类型会被正确地使用。 元数据 汇编进程同样额 输出元数据。这是一个很重要的一部分 .NET 代码分享的故事。不论你要用 C#去建立一个客户端的应用程序还是用 C#去建立一个被一些人用在应用程序上的类库,你都会想要利用一些已经编译好的 .NET 代码。那个代码或许被微软提供了一部分 .NET 结构,或者它也许被一些网上的用户提供。使用外来代码的关键是让 C#编译器知道那个类和那个变量在另外的基础代码中以便它能够在你工作的预编译中发现并将你写的代码与源代码相匹配。 将元数据看目录
21、对于你的编译代码而言。 C#编译的源代码位数在编译代码中和MSIL 的生成一同存在。的方法和变量的 类型完全地在元数据中被描述,准备好被其他应用程序来读取。例如, VB.NET 可以从一个 .NET 库中读取元数据来提供对一个特定的类来说列出的所有能够被有效使用的方法的智能感应的能力。 如果你已经使用 COM 进行工作,你或许熟悉了类型库。类型库的目标是提供同样的目录功能给 COM 对象。然而,类型库从一些局限之处提供,事实上并不是所有的关于目标的数据都能被放入类型库中。在 .NET 中的元数据并不具有这个缺点。所有的用来描述类的信息的代码被放置在元数据中。 构件 有时,你需要用 C#去建立一
22、个终端的应用程序。这些应用程 序被打包成一个可执行的文件并且使用 .EXE 作为扩展名。 C#完全地支持 .EXE 文件的建立。 然而,也有几次你不想以被用于其它的程序。你也许会想要建立一些实用的 C#类,比如传给一个想要使用你的类在 VB.NET 应用程序中的 VB.NET 的开发者。在这种情况下,你将不会建立一个应用程序,取而代之的你将建立一个构件。 一个构件是一个元数据的代码包。 当做一个单元来配置,并且这些类将会分享同样层级的版本控制,安全信息和动态需求。将构件看做一个逻辑的 DLL。如果你对微软的翻译服务或者 COM+很熟悉,那么你可以把构件看做 与 .NET 等价的包。 有两种构件
23、:私有构件和全局构件。当你建立了你自己的构件,你不需要指明你是想建立一个全局的构件还是私有的构件。你只能使你的代码被单独的应用程序访问。你的构件是一个类似于 DLL 的包,并且被安装进同样的目录当你的应用程序运行它时。应用程序是在与你构件相同目录下时才可执行的。 如果你想要在更多的应用程序中分享你的代码,全局的构件。全局构件可以被任何系统的 .NET 应用程序使用,而不用考虑它被安装在哪个目录中。微软装配构件作为 .NET 结构的一部分,并且每个微软构件被安装作为一个全局构件。微软结 构 SDK中包含了公用的可以从全局构件存储器中安装和删除构件的功能。 C#在某种程度上可以看作是 .NET 面
24、向 Windows 环境的一种编程语言。在过去的十几年里,虽然 VB 和 C+最终已成为非常强大的语言,来的一些内容。 对于 Visual Basic 来说,它的主要优点是很容易理解,许多编程工作都很容易完成,基本上隐藏了 Windows API 和 COM 组件结构的内涵。其缺点是 Visual Basic从来没有实现真正意义上的面向对象,的早期版本 (BASIC 主要是为了让初学者更容易理解,而不是为了编写大型商业应用程序 ),所以不能真正成为结构化或面向对象的编程语言。 另一方面, C+在 ANSI C+语言定义中有其自己的根。它与 ANSI 不完全兼容,因为 Microsoft 是在
25、ANSI 定义标准化之前编写 C+编译器的,但已经相当接近了。遗憾的是,这导致了两个问题。其一, ANSI C+是在十几年前的技术条件下开发的,因此不支持现在的概念 (例如 Unicode 字符串和生成 XML 文档 ),某些古老的语法结构是为以前的编译器设计的 (例如成员函数的声明和定义是分开的 )。其二,Microsoft同时还试图把 C+演变为一种用于在 Windows上执行高性能任务的语言 在语言中避免添加大量 Microsoft 专用的关键字和各种库。其结果是在 Windows中,该语言成为了一种非常杂乱的语言。让一个 C+开发人员说说字符串有多少个定义方式就可以说明这一点: cha
26、r*、 LPTSTR、 (MFC 版本 )、 CString (WTL 版本 )、wchar_t*和 OLECHAR*等。 现在进入 .NET 时代 一种全新的环境,它对这两种语言都进行了新的扩展。Microsoft 给 C+添加了许多 Microsoft 专用的关键字,并把 VB 演变为 VB.NET,保留 了一些基本的 VB 语法,但在设计上完全不同,从实际应用的角度来看, VB.NET是一种新语言。在这里, Visua l C# .NET。 Microsoft 在正式场合把 C#描述为一种简单、现代、面向对象、类型非常安全、派生于 C 和 C+的编程语言。大多数独立的评论员对其说法是“派
27、生于 C、 C+ 和 Java” C#非常类似于 C+和 Java,并用括号 ( )来标记代码块,用分号分隔各行语句。对 C#代码的第一印象是它非常类似于 C+或 Java 代码。但在这些表面上的类似性后面, C#学习起来要比 C+容易得多,但比 Java 难一些。其设计与现代开发工具的适应性要比其他语言更高,它同时具有 Visua l Bas ic 的易用性、高性能以及 C+的低级内存访问性。 C#包括以下一些特性: 完全支持类和面向对象编程,包括接口和继承、虚函数和运算符重载的处理。 定义完整、一致的基本类型集。 对自动生成 XML 文档说明的内置支持。 自动清理动态分配的内存。 可以用用
28、户定义的特性来标记类或方法。这可以用于文档说明,对编译有一定的影响 (例如,把方法标记为只在调试时编译 )。 对 .NET 基类库的完全访问权,并易于访问 Windows API。 可以使用指针和直接内存访问,但 C#语言可以在没有它们的条件下访问内存。 以 VB 的风格支持属性和事件。 改变编译器选项, ActiveX 控件 (COM 组件 )相同的方式由其他代码调用。 C#可以用于编写 ASP.NET 动态 Web 页面和 XML Web 服务。 应该指出,对于上述大多数特性, VB.NET 和 Managed C+也具备。但 C#从一开始就使用 .NET,对 .NET 特性的支持不仅是完整的,而且提供了比其他语言更合适的语法。 C#语言本身非常类似于 Java,但其中有一些改进,因为 Java 并不是为应用于 .NET 环境而设计的。在结束这个主题前,还要指出 C#的两个局限性。其一是该语言不适用于编写时间急迫或性能非常高的代码,例如一个要运行 1000 或 1050 次的循环,并在不需要这些循环时,立即清理它们所占用的资源。在这方面, C+可能仍是所有低级语言中的佼佼者。其二是 C#缺乏性能极高的应用程序所需要的关键功能,包裹保证在代码的特定地方与性的内联和析构函数函数。但这类应用程序非常少
Copyright © 2018-2021 Wenke99.com All rights reserved
工信部备案号:浙ICP备20026746号-2
公安局备案号:浙公网安备33038302330469号
本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。