当前位置:K88软件开发文章中心编程语言.NET.NET01 → 文章内容

C#,自然的进步

减小字体 增大字体 作者:佚名  来源:翔宇亭IT乐园  发布时间:2018-12-31 11:55:20

elphi 中借鉴东西与从 C 和 C++ 借鉴的东西一样多(如果没有超过的话)。请注意,下面的信息基于 C# 操作规程,可能不准确代表最终的产品发行版。

C# 是一种 RAD 环境

C# 提供 Java 风格的垃圾收集:C# 提供的最重要的 RAD 功能之一就是 Java 风格的垃圾收集。在运行时的任意时间内,所有没有引用的对象会自动删除。通过将开发人员从手动内存管理任务中解放出来,垃圾收集使程序开发变得容易且不易出错。但是,自动垃圾收集是耗时的,并且是不可预知的。因此,C# 允许开发人员在要求实时性能的情况下局部禁用垃圾收集 — 通过将代码标记为 unsafe。

C# 实现了 Java 和 Delphi 风格的值/引用类型系统:为了进一步支持 RAD,C# 始终以 Java 和 Delphi 风格的值/引用类型系统处理 C/C++ 指针模型。在这个系统中,内建类型(integer、real、string,等等)、枚举 (enumeration) 和结构 (structure) 都是值类型。赋值运算符和比较运算符复制并检查这些类型的变量的值。接口、类和授权(将在后面说明)都是引用类型。赋值运算符和比较运算符复制并检查这些类型的变量所引用的对象的同一性。

这种值/引用类型系统比 C++ 的指针模型要简单得多。它使对象处理更加容易,并消除了困扰 C 和 C++ 程序的许多内存错误。

C# 接口是独立于类来声明的:C# 也支持类似 Java 和 Delphi 的接口模型,接口是独立于类来声明的。这与 C++ 模型是对立的,在 C++ 中接口实际上就是抽象基类。接口和类都可以继承多个接口。而类可以继承一个基类,接口根本不能继承类。这种模型避免了 C++ 的多继承问题,C++ 中不同基类中的实现可能出现冲突。因此也不再需要诸如虚拟继承和显式作用域这类复杂机制。C# 的简化接口模型有助于加快应用程序的开发。

类方法的声明和定义被组合在一起:C# 简化开发的另一个方面是将类方法的声明和定义组合在一起,与 Java 的做法十分类似。 C++ 开发人员必须为声明(头文件)和定义(实现文件)维护单独的文件,结果使得软件开发过程变得复杂。C# 甚至能够自动找出源代码模块之间的关系,从而使开发人员从一项附加的杂务中解脱出来。尽管 C++ 需要使用 #include(Delphi 需要使用 uses)来定位相关的源文件,但 C# 不需要任何额外的语句。

C# 使用方法引用,称为授权,而不使用方法指针:C# 使用方法引用来快速连接对象和方法。称为授权的这些方法引用类似于 Delphi 的过程类型。Hejlsberg 也将同一机制引入 Visual J++ 6.0 中,不过它并不是标准 Java 规范的一部分。方法引用有点像 C++ 的方法指针,但它要优越、安全和有用得多。

授权是一种引用类型,它持有方法的签名。 应用程序可将符合这一签名的任何方法赋给授权变量。当调用这种授权变量时,相关的方法就会被调用。与 Delphi 的过程类型不同,C# 授权自动支持多点传送。应用程序可以将许多方法赋给一个授权变量;当调用此变量时,所有方法都会被调用。

C# 使用 Java 的简单线程同步机制。要在 C# 中实现线程同步,开发人员只须对关键的代码块作标志即可。 Java 开发人员使用 synchronized 关键字,而 C# 开发人员使用 lock。隐藏的互斥块将带有标志的代码块包装起来,在任一时刻只允许一个线程执行这段代码。除了关键字不同之外,这一机制在 C# 和 Java 中是完全相同的。因为线程所有编程任务最容易出错的一种,对同步进行简化的任何特性都有助于快速应用程序开发。

显式的重载声明:最后,C# 使用显式的重载声明来支持 RAD。显式的重载声明通过保护类的方法名称空间并指出意外的命名冲突来支持快速应用程序开发。

C# 导出类的开发人员必须显式地用关键字 override 标记方法重载,正像在 Delphi 中所做的那样。如果导出类包含一个与基类中的一个虚方法同名的未标记方法,则编译器无法明确辨别作者的意图。

另一方面,命名冲突可能是不可避免的;尤其是当基类和导出类由不同的程序员(可能为不同的公司工作)实现时更是不可避免。在这种情况下,编译器将发出一个警告,并将导出类的方法视为一个新声明,而不将其视为重载。

另一方面,如果程序员有意让导出类中的一个新方法与基类中的某个虚方法同名,则他(或她)可以使用 new 关键字来阻止编译器发出警告。

C# 的其他特性

考虑一下刚刚讨论过的的所有语言特性,对 RAD 的强大支持似乎是 Microsoft 为 C# 制定的一个最主要的目标。但是,C# 还必须致力于其他重要的开发需求。这些需求包括跨平台部署、访问平台固有的资源和对 COM 和 .Net 平台的支持。让我们分析一下旨在支持这些需求的 C# 语言特性。

跨平台部署:C# 以 Java 解决这一问题的相同方式解决了跨平台部署的问题。C# 编译器生成由 .Net 运行时解释的字节码流。运行时组件的工作方式与 Java 虚拟机十分类似;应用程序可以部署到已安装了 .Net 运行时的任何设备上。

应用程序对平台固有资源的访问:与 Java 虚拟机不同,.Net 运行时允许程序访问平台固有的资源。 例如,一个 C# 程序可以利用 Windows API 作为 Windows 2000 上全功能的应用程序运行。通过使用 Windows CE API 子集,同一个程序也可以在 PDA 上运行。 当然,并不是应用程序预期的所有服务都可在所有设备上获得。因此在所有目标平台上测试软件是开发人员的责任,如有必要,开发人员还可以编写特殊情况的代码,那将使系统在缺少所需的服务时仍能够工作。

支持 COM 和 .Net:为了支持 COM 和 .Net 平台,C# 包含一种称为属性的独特语言特性。一个属性实际上就是一个 C# 类,它通过修饰源代码来提供元信息。属性使 C# 能够支持特定的技术,如 COM 和 .Net,而不会干扰语言规范本身。

例如,C# 提供将 C# 接口转换为 COM 接口的属性类。另一些属性类将 C# 类转换为 COM 类。执行这些转换不需要任何 IDL 或类工厂。某些语言观察家声称所有 C# 类都是 COM 对象。这不正确 — 但通过合适的属性,任何 C# 类很容易转换为一个 COM 对象。

随编译器提供的另一个属性库将 C# 类和函数包装为 Web 服务。Web 服务是可在因特网上通过交互协议(如 SOAP)调用的托管软件模块。SOAP 将方法调用与它们的参数和返回值一起包装在 XML 数据包中。Web 服务可用许多语言编写,并可部署到许多硬件和软件平台上。而且,不同类型的 Web 服务可以协作组成整个 Web 应用程序。通过使用

上一页  [1] [2] [3]  下一页


C#,自然的进步