C#编程语言概述外文翻译资料

 2021-12-29 10:12

英语原文共 14 页,剩余内容已隐藏,支付完成后下载完整资料


C#编程语言概述

1.C、C 和C#的历史

C#编程语言是在C和C 的基础下创建的编程语言。这说明了它强大的功能和简单的学习曲线。C和C 不能这样说,但是因为C#是从C和C 创建的基础上,微软冒昧地解除了一些更加繁重的负担功能 - 如指针。本节将介绍C和C 语言,追踪他们的进化到C#。

C编程语言最初设计用于UNIX操作系统。C用于创建许多UNIX应用程序,包括C编译器,最终用于编写UNIX本身。它在学术领域的广泛接受扩大到包括商业世界和软件供应商,比如微软和Borland发布个人电脑的C编译器。最初的Windows API设计用于使用C语言编写的Windows代码,最新的核心Windows操作系统API至今仍与C兼容。

从设计的角度来看,C缺乏像Smalltalk这样的其他语言已经接受的细节:对象的概念。您将在第8章“编写面向对象的代码”中了解有关对象的更多信息。现在,将对象视为数据集合和可以对该数据执行的一组操作。对象样式编码可以使用C来完成,但是对象的概念没有被语言强制执行。如果你想将代码结构化为类似对象,那很好。如果你没有,那很好。C真的不在乎。对象不是语言的固有部分,因此很多人并没有太注意这种编程范式。

在面向对象开发的概念开始被接受之后,很明显C需要被改进以接受这种新的代码思考方式。 创建C 是为了体现这种改进。它被设计为向后兼容C(这样所有C程序也可以是C 程序,并且可以用C 编译器编译)。C 语言的主要补充是对这个新对象概念的支持。C 语言增加了对类(对象的“模板”)的支持,并使整个一代的C程序员能够根据对象及其行为进行思考。

C 语言是对C的改进,但它仍然有一些缺点。C和C 很难掌握。与易于使用的语言(如Visual Basic)不同,C和C 非常“低级”,需要您进行大量编码才能使应用程序运行良好。您必须编写自己的代码来处理诸如内存管理和错误检查类的问题。C和C 可以产生非常强大的应用程序,但是您需要确保代码运行良好。一个错误可能导致整个应用程序崩溃或意外行为。

由于C 设计目标是保持与C的向后兼容性,C 无法摆脱C的低级性质。

Microsoft设计C#以保留C和C 的大部分语法。熟悉这些语言的开发人员可以选择C#代码并开始相对快速的编码。然而,C#的一大优势是它的设计者选择不使其向后兼容C和C 。虽然这似乎是一个糟糕的事情,但它实际上是好消息。C#消除了使C和C 难以使用的东西。因为所有的C代码都是C 代码,所以C 必须保留C中发现的所有原始怪癖和缺陷。C#从一个干净的平板开始,没有任何兼容性要求,因此它可以保留其前辈的优势并摒弃弱点 这让C和C 程序员的生活变得艰难。

2.介绍C#

C#是.NET Framework中引入的新语言,它源自C 。但是,C#是一种现代的,面向对象的(从头开始)类型安全的语言。

2.1语言功能

以下部分简要介绍了C#语言的一些功能。如果您觉得其中一些概念不熟悉,请不要担心。所有这些都在后面的章节中详细介绍。

2.1.1类

C#中的所有代码和数据都必须包含在类中。您不能在类之外定义变量,也不能编写任何不在类中的代码。类可以有构造函数,它们在创建类的对象时执行,而析构函数则在类的对象被销毁时执行。类支持单继承,所有类最终都派生自一个名为object的基类。C#支持版本控制技术,以帮助您的类随着时间的推移而发展,同时保持与使用早期版本的类的代码的兼容性。

举个例子,看一下名为Family的类。此类包含两个静态字段,用于保存系列成员的名字和姓氏,以及一个返回系列成员全名的方法。

class Class1

{

public string FirstName;

public string LastName;

public string FullName()

{

}

return FirstName LastName;

}

注意单继承意味着C#类只能从一个基类继承。 C#使您可以将类分组为一组称为命名空间的类。命名空间具有名称,可以帮助将类的集合组织成逻辑分组。 当您开始学习C#时,很明显所有与.NET Framework相关的命名空间都以System开头。Microsoft还选择包含一些有助于向后兼容和API访问的类。这些类包含在Microsoft命名空间中。

2.1.2数据类型

C#允许您使用两种类型的数据:值类型和引用类型。值类型包含实际值。 引用类型包含对存储在其他位置的值的引用。原始类型(如char,int和float)以及枚举值和结构都是值类型。引用类型包含处理对象和数组的变量。 C#带有预定义的引用类型(对象和字符串),以及预定义的值类型(sbyte,short,int,long,byte,ushort,uint,ulong,float,double,bool,char和decimal)。 您还可以在代码中定义自己的值和引用类型。所有值和引用类型最终都来自称为对象的基类型。

C#允许您将一种类型的值转换为另一种类型的值。 您可以使用隐式转换和显式转换。 隐式转换总是成功并且不会丢失任何信息(例如,您可以将int转换为long而不会丢失任何数据,因为long大于int)。显式转换可能会导致您丢失数据(例如,将long转换为int可能会导致数据丢失,因为long可以保存比int更大的值)。您必须在代码中编写一个强制转换操作符才能进行显式转换。

2.1.3跨域

请参阅第3章“使用V进行隐式和表达它的转换。您可以在C#中使用一维和多维数组。多维数组可以是矩形的,其中每个数组具有相同的尺寸,或者是锯齿状的,其中每个阵列具有不同的尺寸。

类和结构可以包含称为属性和字段的数据成员。字段是与封闭类或结构关联的变量。例如,您可以定义名为Employee的结构,该结构具有名为Name的字段。如果你定义一个Employee类型的变量名为CurrentEmployee,您可以通过编写CurrentEmployee.Name来检索员工的姓名。属性类似于字段,但允许您编写代码以指定代码访问值时应发生的情况。例如,如果必须从数据库中读取员工的姓名,则可以编写代码说,“当有人要求提供Name属性的值时,请从数据库中读取名称并将名称作为字符串返回。”

2.1.4函数

函数是一段可调用的代码,它可能会或可能不会将值返回给最初调用它的代码。函数的一个示例是本章前面的Family类中显示的FullName函数。函数通常与返回信息的代码段相关联,而方法通常不返回信息。然而,出于我们的目的,我们将它们作为函数进行概括和引用。

函数可以有四种参数:

bull;输入参数具有发送到函数的值,但该函数不能更改这些值。

bull;输出参数在发送到函数时没有值,但函数可以为它们提供值并将值发送回调用者。

bull;参考参数传递对另一个值的引用。 它们有一个值进入函数,该值可以在函数内部更改。

bull;参数在列表中定义可变数量的参数。

C#和CLR一起工作以提供自动内存管理。您不需要编写“为整数分配足够的内存”或“释放此对象正在使用的内存”的代码。CLR监视您的内存使用情况,并在您需要时自动检索更多内存。它还会在检测到不再使用内存时自动释放内存(这也称为垃圾收集)。

C#提供了各种运算符,使您可以编写数学和按位表达式。可以重新定义许多(但不是全部)这些运算符,使您能够更改运算符的工作方式。

C#支持一长串语句,使您能够在代码中定义各种执行路径。使用if,switch,while,for,break和continue等关键字的流控制语句使您的代码能够分支到不同的路径,具体取决于变量的值。

类可以包含代码和数据。每个类成员都有一个称为可访问性范围的东西,它定义了成员对其他对象的可见性。C#支持公共,受保护,内部,受保护的内部和私有可访问性范围。

2.1.5变量

变量可以定义为常量。 常量具有在执行代码期间无法更改的值。例如,pi的值是常量的一个很好的例子,因为它的值不会随着代码的运行而改变。枚举类型声明为相关的常量组指定类型名称。例如,您可以使用Mercury的值定义行星的枚举,并在代码中定义这些名称。在代码中使用枚举名称使代码比使用数字代表每个行星更具可读性。

C#提供了一种用于定义和处理事件的内置机制。 如果编写执行冗长操作的类,则可能需要在操作完成时调用事件。客户端可以订阅该事件并在其代码中捕获事件,这使他们能够在您完成冗长的操作时收到通知。 C#中的事件处理机制使用委托,委托是引用函数的变量。

注意事件处理程序是代码中的一个过程,用于确定事件发生时要执行的操作,例如用户单击按钮。

如果您的类包含一组值,则客户端可能希望访问这些值,就像您的类是数组一样。您可以编写一段称为索引器的代码,以使您的类可以像访问数组一样进行访问。假设您编写了一个名为Rainbow的类,例如,它包含彩虹中的一组颜色。 呼叫者可能想要写MyRainbow [0]来检索彩虹中的第一种颜色。您可以在Rainbow类中编写索引器,以定义调用者访问类时应返回的内容,就好像它是一个值数组一样。

2.1.6接口

C#支持接口,接口是指定一组功能的属性,方法和事件组。C#类可以实现接口,告诉用户该类支持接口记录的功能集。您可以开发接口的实现,而不会干扰任何现有代码,从而最大限度地减少兼容性问题。一旦发布了一个接口,它就无法更改,但它可以通过继承发展。C#类可以实现许多接口,尽管这些类只能从单个基类继承。

让我们看一个现实世界的例子,它将从接口中受益,以说明它在C#中的非常积极的作用。目前可用的许多应用程序都支持加载项。假设您已经创建了用于编写应用程序的代码编辑器。此代码编辑器在执行时具有加载加载项的功能。为此,加载项必须遵循一些规则。DLL加载项必须导出名为CEEntry的函数,DLL的名称必须以CEd开头。当我们运行代码编辑器时,它会扫描其工作目录中所有以CEd开头的DLL。当它找到一个时,它被加载;然后它使用GetProcAddress来定位DLL中的CEEntry函数,从而验证您是否遵循了创建加载项所需的所有规则。这种创建和加载加载项的方法非常繁琐,因为它会使代码编辑器承担更多的验证任务。如果在此实例中使用了接口,则加载项DLL可能已实现接口,从而保证DLL本身存在所有必需的方法,属性和事件,并作为指定的文档运行。

2.1.7属性

属性向CLR声明有关您的类的其他信息。在过去,如果你想让你的类自我描述,你必须采取一种断开连接的方法,其中文档存储在外部文件,如IDL甚至HTML文件。属性通过使开发人员能够将信息绑定到类(任何类型的信息)来解决此问题。例如,您可以使用属性将文档信息嵌入到类中。 属性还可用于将运行时信息绑定到类,定义它在使用时应如何操作。可能性是无穷无尽的,这就是Microsoft在.NET Framework中包含许多预定义属性的原因。

2.2编译C#

通过C#编译器运行C#代码会产生两个重要的信息:代码和元数据。以下部分描述了这两个项目,然后通过检查.NET代码的二进制构建块来完成:程序集。

2.2.1微软中间语言(MSIL)

C#编译器输出的代码使用称为Microsoft Intermediate Language或MSIL的语言编写。MSIL由一组特定的insutctions组成,用于指定代码的执行方式。它包含诸如变量初始化,调用对象方法和错误处理等操作的指令,仅举几例。C#不是编译过程中源代码更改为MSIL的唯一语言。 所有与.NET兼容的语言(包括Visual Basic .NET和Managed C )在编译源代码时都会生成MSIL。因为所有.NET语言都编译为相同的MSIL指令集,并且因为所有.NET语言都使用相同的运行时,所以来自不同语言和不同编译器的代码可以轻松地协同工作。

MSIL不是物理CPU的特定指令集。它对您机器中的CPU一无所知,而您的机器对MSIL一无所知。那么,如果您的CPU无法读取MSIL,那么您的.NET代码将如何运行?答案是,当代码首次运行时,MSIL代码将转换为特定于CPU的代码。此过程称为“即时”编译或JIT。JIT编译器的工作是将您的通用MSIL代码转换为可由CPU执行的机器代码。

您可能想知道这个过程中的额外步骤。为什么编译器可以直接生成特定于CPU的代码时生成MSIL?毕竟,编译器过去总是这样做。这有几个原因。首先,MSIL使您编译的代码可以轻松移动到不同的硬件。假设您已经编写了一些C#代码,并且您希望它可以在您的桌面和手持设备上运行。这两个设备很可能有不同类型的CPU。如果您只有一个针对特定CPU的C#编译器,那么您需要两个C#编译器:一个针对您的桌面CPU而另一个针对您的掌上电脑CPU。您必须编译两次代码,确保将正确的代码放在正确的设备上。使用MSIL,您可以编译一次。在桌面计算机上安装.NET Framework包括一个JIT编译器,可将MSIL转换为桌面的CPU特定代码。在掌上电脑上安装.NET Framework包括一个JIT编译器,可将同一个MSIL转换为掌上电脑的CPU特定代码。您现在拥有一个可以在任何具有.NET JIT编译器的设备上运行的MSIL代码库。该设备上的JIT编译器负责使您的代码在设备上运行。

编译器使用MSIL的另一个原因是验证过程可以轻松读取指令集。JIT编译器的部分工作是验证您的代码以确保它尽可能干净。验证过程可确保您的代码正确访问内存,并在调用期望特定类型的方法时使用正确的变量类型。这些检查可确保您的代码不会执行任何可能导致代码崩溃的指

全文共9248字,剩余内容已隐藏,支付完成后下载完整资料


资料编号:[3002]

原文和译文剩余内容已隐藏,您需要先支付 30元 才能查看原文和译文全部内容!立即支付

以上是毕业论文外文翻译,课题毕业论文、任务书、文献综述、开题报告、程序设计、图纸设计等资料可联系客服协助查找。