标题：C SHARP
简介
C Sharp是微软公司在2000年6月发布的一种新的编程语言，主要由安德斯·海尔斯伯格（Anders Hejlsberg）主持开发，C Sharp与Java非常相似，它包括了诸如单一继承、界面、与Java几乎同样的语法，和编译成中间代码再运行的过程。但是C Sharp与Java有着明显的不同，它借鉴了Delphi的一个特点，与COM(组件对象模型)是直接集成的，而且它是微软公司.NET windows网络框架的主角。[1]C Sharp由，微软在2000年发布了这种语言。[2-4]
C Sharp语言定义主要是从 C/C++ 及 Java 继承而来的，而且语言中的许多元素也反映了这一点。C Sharp在设计者从C++继承的可选选项方面比JAVA要广泛一些（比如说struts)，它还增加了自己新的特点（比方说源代码版本定义）。但它还太不成熟，不可能挤垮JAVA。C Sharp还需要进化成一种开发者能够接受和采用的语言。而微软当前为它的这种新语言大造声势也是值得注意的。
C Sharp是面向对象的编程语言。它使得程序员可以快速地编写各种基于MICROSOFT .NET平台的应用程序，MICROSOFT .NET提供了一系列的工具和服务来最大程度地开发利用计算与通讯领域。
正是由于C Sharp面向对象的卓越设计，使它成为构建各类组件的理想之选——无论是高级的商业对象还是系统级的应用程序。使用简单的C Sharp语言结构，这些组件可以方便的转化为XML网络服务，从而使它们可以由任何语言在任何操作系统上通过INTERNET进行调用。
C Sharp使得C++程序员可以高效的开发程序，而绝不损失C/C++原有的强大的功能。因为这种继承关系，C Sharp与C/C++具有极大的相似性，熟悉类似语言的开发者可以很快的转向C Sharp。[5-6]
（概述图片来源：[7]）
设计目标
ECMA标准列出的C Sharp设计目标[8]：
C Sharp旨在设计成为一种“简单、现代、通用”，以及面向对象的程序设计语言[9]此种语言的实现，应提供对于以下软件工程要素的支持：强类型检查、数组维度检查、未初始化的变量引用检测、自动垃圾收集（Garbage Collection，指一种自动内存释放技术）。软件必须做到强大、持久，并具有较强的编程生产力。此种语言为在分布式环境中的开发提供适用的组件开发应用。
为使程序员容易迁移到这种语言，源代码的可移植性十分重要，尤其是对于那些已熟悉C和C++的程序员而言。对国际化的支持非常重要。C Sharp适合为独立和嵌入式的系统编写程序，从使用复杂操作系统的大型系统到特定应用的小型系统均适用。[10]
语言结构
基本类型类　　
类：在C Sharp中类的声明与C++和Java很相似。但是，不象C++，C Sharp结构体与类是不支持继承。但是，与Java相同的是，一个结构体可以实现接口(interface)。Java的关键字import已经被替换成using，它起到了同样的作用。
类可以是抽象的和不可继承的：一个被申明成abstract的类不能被实例化，它只能被用做一个基类，C Sharp关键字lock就像Java关键字final，它申明一个类不是抽象的，但是它也不能被用做另一个类的基类界面：就象在Java中一样，一个界面是一组方法集合的抽象定义。当一个类或结构体实现一个界面的时候，它必须实现这个界面中定义的所有方法。一个单一的类可以实现几个界面，也许以后会出现一些微妙的差别，但是这个特点看起来与Java相比没有变化。[11]
布尔运算
布尔运算：条件表达式的结果是布尔数据类型，布尔数据类型是这种语言中独立的一种数据类型，从布尔类型到其他类型没有直接的转换过程，布尔常量true和false是C Sharp中的关键字。错误处理：如Java中那样，通过抛出和捕捉异常对象来管理错误处理过程。[12]
内存管理
内存管理：由底层.NET框架进行自动内存垃圾回收。一个基本的C Sharp类中包含数据成员、属性、构造器和方法。属性可以是静态或实例成员。[13]
接口
接口是其他类型为确保它们支持某些操作而实现的引用类型。接口从不直接创建而且没有实际的表示形式，其他类型必须转换为接口类型。
一个接口定义一个协定。实现接口的类或结构必须遵守其协定。接口可以包含方法、属性、索引器和事件作为成员。[11]　
强类型
C Sharp是一个强类型的语言，它的数值类型有一些可以进行隐式转换，其他的必须显式转换，隐式转换的类型只能是长度短的类型转换成长的类型，int可以转换成long、float、double、decimal，反之必须显式的转换。[14]　
编译编译
C Sharp程序不能直接编译成标准的二进制可执行形式，与 Java 类似，它被编译成为中间代码(Microsoft Intermediate Language)，然后通过 .NET Framework 的虚拟机——被称之为通用语言执行层(Common Language Runtime, CLR)——执行。　[15]
预编译
C Sharp 中存在预编译指令支持条件编译,警告，错误报告和编译行控制.可用的预编译指令有： 
#define#undef#if#elif#else#endif#warning#error#line []没有了#include 伪指令.你无法再用#define 语句对符号赋值,所以就不存在源代码替换的概念--这些符号只能用在#if和#elif伪指令里.在#line伪指令里的数字（和可选的名字）能够修改行号还有#warning和#error输出结果的文件名。[16]
命名空间命名空间提供了一种方法来唯一标识一个类型以及进行类型的逻辑组织。命名空间可以嵌套使用并可以跨程序集使用。一个类型的完全限定名包括所有命名空间。在一个命名空间中，所有的类型必须有一个唯一的名称。基本类型库（Base Class Library）是.NET Framework的所有语言可下可用的命名空间集。命名空间是组织和重用代码的编译单元。命名空间和文件的结构关系不像Java，命名空间与文件的结构之间没有关系。using语句是用来在使用类型时不需要用全限定名的类型，全限定名也可以被使用。命名空间中的声明，C Sharp与C++有所不同，是C Sharp独有的特点。[17]
操作符重载一些操作符能够被重载，而另一些则不能.特别的是，没有一个赋值运算符能够被重载.能够被重载的单目操作符是： 
+ - ! ~ ++ -- true false 
能够被重载的二元运算符是： 
+ - * / % & | ^ << >> == != > < >= <=。[16]
特点
动态查阅
C Sharp 4.0 新增 dynamic关键字，提供动态编程（dynamic programming）把既有的静态对象标记为动态对象，类似javascript,Python或 Ruby。[18]　
中间代码
微软在用户选择何时MSIL应该编译成机器码的时候是留了很大的余地.微软公司很小心的声称MSIL不是解释性的，而是被编译成了机器码.它也明白许多--如果不是大多数的话--程序员认为Java程序要不可避免的比C编写的任何东西都要慢.而这种实现方式决定了基于MSIL的程序（指的是用C Sharp,Visual Basic,"Managed C++"--C++的一个符合CLS的版本--等语言编写的程序）将在性能上超过"解释性的"Java代码.当然，这一点还需要得到事实证明，因为C Sharp和其他生成MSIL的编译器还没有发布.但是Java JIT编译器的普遍存在使得Java和C Sharp在性能上相对相同.象"C Sharp是编译语言而Java是解释性的，"之类的声明只是商业技巧.Java的中间代码和MSIL都是中间的汇编形式的语言，它们在运行时或其它的时候被编译成机器代码。[19]　
命名空间中的申明
当你创建一个程序的时候，你在一个命名空间里创建了一个或多个类.同在这个命名空间里（在类的外面）你还有可能声明界面，枚举类型和结构体。必须使用using关键字来引用其他命名空间的内容。[19]　
基本的数据类型
C Sharp拥有比C/C++或者Java更广泛的数据类型.这些类型是bool、byte、ubyte、short、ushort、int、uint、long、ulong、float、double和decimal，像Java一样，所有这些类型都有一个固定的大小.又像C和C++一样，每个数据类型都有有符号和无符号两种类型.与Java相同的是，一个字符变量包含的是一个16位的Unicode字符.C Sharp新的数据类型是decimal数据类型，对于货币数据，它能存放28位10进制数字。[19]　
两个基本类
一个名叫object的类是所有其他类的基类。而一个名叫string的类也象object一样是这个语言的一部分.作为语言的一部分存在意味着编译器有可能使用它--无论何时你在程序中写入一句带引号的字符串，编译器会创建一个string对象来保存它。[19]　
参数传递
方法可以被声明接受可变数目的参数.缺省的参数传递方法是对基本数据类型进行值传递。ref关键字可以用来强迫一个变量通过引用传递，这使得一个变量可以接受一个返回值。out关键字也能声明引用传递过程，与ref不同的地方是，它指明这个参数并不需要初始值。[19]　
与COM的集成
C Sharp对Windows程序最大的卖点可能就是它与COM的无缝集成了，COM就是微软的Win32组件技术.实际上，最终有可能在任何.NET语言里编写COM客户和服务器端。C Sharp编写的类可以子类化一个已存在的COM组件;生成的类也能被作为一个COM组件使用，然后又能使用，比方说，JScript语言子类化它从而得到第三个COM组件。这种现象的结果是导致了一个运行环境的产生，在这个环境里的组件是网络服务，可用任何.NET语言子类化。[19]　
索引下标
一个索引与属性除了不使用属性名来引用类成员而是用一个方括号中的数字来匿名引用（就象用数组下标一样）以外是相似的.。[19]
代理和反馈
一个代理对象包括了访问一个特定对象的特定方法所需的信息.只要把它当成一个聪明的方法指针就行了。代理对象可以被移动到另一个地方，然后可以通过访问它来对已存在的方法进行类型安全的调用.一个反馈方法是代理的特例.event关键字用在将在事件发生的时候被当成代理调用的方法声明中。[19]