C♯

C#是微软推出的一种基于.NET框架的、面向对象的高级编程语言。C#以.NET框架类库作为基础，拥有类似Visual Basic的快速开发能力。C#由安德斯·海尔斯伯格主持开发，微软在2000年发布了这种语言，希望借助这种语言来取代Java。C#已经成为Ecma国际和国际标准组织的标准规范。

C#的发音为“C sharp”，“#”读作“sharp”（），命名启发于音乐上的音名“C♯”，在音乐中“C♯”表示C升半音，为比C高一点的音节，且“#”形似4个加号，微软借助这样的命名，表示C#在一些语言特性方面对C++的提升的意思。

由于显示器（标准字体、浏览器等）的技术限制，且大部分的键盘配置上不存在升记号（♯），所以井号（#）被用于此程式语言的名称中，约定在ECMA-334 C#语言规范中。

ECMA标准列出的C#设计目标：

原Borland公司的首席研发设计师安德斯·海尔斯伯格（Anders Hejlsberg）在微软开发了Visual J++ 1.0，很快的Visual J++由1.1版本升级到6.0版。SUN公司认为Visual J++ 违反了Java开发平台的中立性，对微软提出了诉讼。2000年6月26日微软在奥兰多举行的“职业开发人员技术大会”（PDC 2000）上，发表新的语言C#。C#语言取代了Visual J++，语言本身深受Visual Basic、Java、C和C++ 的影响。

相对于C和C++，这个语言在许多方面进行了限制和增强：

针对于.NET SDK 2.0（相对应于ECMA-334标准第三版），C# 的新特性有：

分部类别将类别的实现分在多个文件中。该概念于C# 中首次出现，除了能将一个类别的成员分开存放，还使ASP.NET中的代码后置得以实现。代码后置实现了HTML代码和后台交互代码的分离。

file1.cs:

file2.cs:

分部类别这个特性允许将一个类别的编写工作分配给多个人，一人写一个文件，便于版本控制。它又可以隔离自动生成的代码和人工书写的代码，例如设计窗体应用程序时。

泛型，或参数化类型，是被C#支持的.NET 2.0特性。不同于C++模版，.NET参数化类型是在运行时被实例化，而不是编译时，因此它可以跨语言，而C++模版却不行。它支持的一些特性并不被C++模版直接支持，比如约束泛型参数实现一个接口。另一方面，C# 不支持无类型的泛型参数。不像Java中的泛型，在CLI虚拟机中，.NET generics使用具化生成泛型参数，它允许优化和保存类型信息。

静态类别它不能被实例化，并且只能有静态成员。这同很多过程语言中的模块概念相类似。

一种新形式的迭代器它提供了函数式编程中的generator，使用codice_1

类似于Python中使用的codice_2

匿名方法类似于函数式编程中的闭包。

委托签名的协变和逆变,

例子：

可空类型（跟个问号，如codice_3）允许设置codice_4给任何类类型。

（codice_5）用于如果类别不为空值时回传它自身，如果为空值则返回之后的操作

主要用作将一个可空类型赋值给不可空类型的简便语法

C# 3.0发布于2007年10月17日，是.NET Framework 3.5的一部分，它的新特性灵感来自于函数式编程语言，如：Haskell和ML，并广泛地引入了Language Integrated Query（LINQ）模式到通用语言运行库中e.

语言集成查询（，缩写：LINQ）： 上下文相关关键字"codice_6, codice_7, codice_8"可用于查询SQL、XML、集合等。这些标识符在LINQ上下文中被作为关键字，但是它们的增加不会破坏原有的名为codice_6、codice_7或codice_8的变量。

可写作：

可写作

假设codice_12实现了codice_13且有一个codice_14方法method

局部变量类型推断：
等同于

它只是一个语法糖，这个特性被匿名类型声明时所需要

Lambda表达式（无函式名称的物件方法在程式语言中的表达语法）: 

编译器翻译Lambda表达式为强类型委托或强类型表达式树.

编译器将自动生成私有变量和适当的getter（get访问器）和setter（set访问器），如：
扩展方法指，一个静态类包含this关键字作为方法的第一参数时，这个方法将被添加到该this的类型中：

允许代码生成器生成方法声明作为扩展点，如果有人在另一个部分类实现了它才会被包含于原代码编译。

例子：
C# 4.0新增dynamic关键字，提供动态编程（dynamic programming），把既有的静态物件标记为动态物件，类似javascript, Python或Ruby。

dynamic关键字标记的字段被处理成一个特殊包装的object对象，它取消了CLI的编译时类型检查

呼叫OpenFile时，顺序可以完全颠倒：
在C#中打开一个Word文件：
在C#中指定Excel的某一格文字：
C# 4.0支援协变和逆变，例如在泛型介面可以加上in、out-{zh:修饰字;zh-hk:修饰字;zh-cn:关键字}-。


加入 out 变数；能够直接宣告一个变数在它要传入的地方，当成一个 out 的引数



C#并不被编译成为能够直接在计算机上执行的二进制本地代码。与Java类似，它被编译成为中间代码（Microsoft Intermediate Language），然后通过.NET Framework的虚拟机——被称为-{zh-hans:通用语言运行库;zh-hant:通用语言执行层}-——执行。

所有的.Net编程语言都被编译成这种被称为通用中间语言的中间代码。因此虽然最终的程序在表面上仍然与传统意义上的可执行文件都具有“.exe”的后缀名。如果计算机上没有安装.Net Framework，那么这些程序会弹出对话框，要求用户下载.net framework。

在程序执行时，.Net Framework将中间代码翻译成为二进制机器码，从而使它得到正确的运行。最终的二进制代码被存储在一个缓冲区（Buffer）中。所以一旦程序使用了相同的代码，那么将会调用缓冲区中的版本。这样如果一个.Net程序第二次被运行，那么这种翻译不需要进行第二次，速度明显加快。

微软公司已经向ECMA申请将C#作为一种标准。在2001年12月，ECMA发布了ECMA-334 C#语言规范。C#在2003年成为一个ISO标准（ISO/IEC 23270）。现在有一些独立的实现正在进行，包括：

下面是一个在-{zh:命令列;zh-hans:命令行;zh-hant:命令提示字元}-上输出Hello World的小-{zh:程序;zh-hans:程序;zh-hant:程式}-，这种-{zh:程序;zh-hans:程序;zh-hant:程式}-通常作为开始学习-{zh:程序;zh-hans:程序;zh-hant:程式}-语言的第一个步骤： 
C# 有5个著名的编译器（compilers）: