C♯

命名

C#的发音为“C sharp”，“#”读作“sharp”（/ʃɑːp/），命名启发于音乐上的音名“C♯”，在音乐中“C♯”表示C升半音，为比C高一点的音节，且“#”形似4个加号，微软借助这样的命名，表示C#在一些语言特性方面对C++的提升的意思。
由于显示器（标准字体、浏览器等）的技术限制，且大部分的键盘布局上不存在升记号（♯），所以井号（#）被用于此编程语言的名称中，约定在ECMA-334 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# 2.0的特性

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

分部类别

分部类别将类别的实现分在多个文件中。该概念于C# 中首次出现，除了能将一个类别的成员分开存放，还使ASP.NET中的代码后置得以实现。代码后置实现了HTML代码和后台交互代码的分离。
file1.cs:
public partial class MyClass1{
    public void MyMethod1()
    {
        // implementation
    }}
file2.cs:
public partial class MyClass1{
    public void MyMethod2()
    {
        // implementation
    }}
分部类别这个特性允许将一个类别的编写工作分配给多个人，一人写一个文件，便于版本控制。它又可以隔离自动生成的代码和人工书写的代码，例如设计窗体应用程序时。

泛型

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

静态类别

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

迭代器

一种新形式的迭代器它提供了函数式编程中的generator，使用yield return
类似于Python中使用的yield
// Method that takes an iterable input (possibly an array)// and returns all even numbers.public static IEnumerable<int> GetEven(IEnumerable<int> numbers){
    foreach(int i in numbers)
    {
        if (i % 2 == 0) yield return i;
    }}

匿名方法

匿名方法类似于函数式编程中的闭包。
public void Foo(object parameter){
    // ...

    ThreadPool.QueueUserWorkItem(delegate
    {
        // anonymous delegates have full access to local variables of the enclosing method
        if(parameter == ...)
        { 
            // ... 
        }

        // ...
    });}

委托的协变和逆变

委托签名的协变和逆变,

属性访问器可以被单独设置访问级别

例子：
string status = string.Empty;public string Status{
    get { return status; }             // anyone can get value of this property,
    protected set { status = value; }  // but only derived classes can change it}

可空类型

可空类型（跟个问号，如int? i = null;）允许设置null给任何类类型。
int? i = null;object o = i;if(o == null)
    Console.WriteLine("Correct behaviour - runtime version from September 2005 or later");else
    Console.WriteLine("Incorrect behaviour - pre-release runtime (from before September 2005)");

??运算符

（??）用于如果类别不为空值时回传它自身，如果为空值则返回之后的操作
object nullObj = null; 
object obj = new Object(); 
return nullObj ?? obj; // returns obj
主要用作将一个可空类型赋值给不可空类型的简便语法
int? i = null;int j = i ?? 0; // Unless i is null, initialize j to i. Else (if i is null), initialize j to 0.

C# 3.0的特性

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

Linq

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

类型初始化器

Customer c = new Customer();c.Name = "James";
可写作：
Customer c = new Customer { Name="James" };

集合初始化器

MyList list = new MyList();list.Add(1);list.Add(2);
可写作
MyList list = new MyList { 1, 2 };
假设MyList实现了System.Collections.IEnumerable且有一个Add方法method

匿名类型

var x = new { Name="James" };

局部变量类型推断

局部变量类型推断：
var x = new Dictionary<string, List<float>>();
等同于
Dictionary<string, List<float>> x = new Dictionary<string, List<float>>();
它只是一个语法糖，这个特性被匿名类型声明时所需要

自动化属性

编译器将自动生成私有变量和适当的getter（get访问器）和setter（set访问器），如：
public string Name{
    get; 
    set; 
}

扩展方法

扩展方法指，一个静态类包含this关键字作为方法的第一参数时，这个方法将被添加到该this的类型中：
public static class IntExtensions{
    public static void PrintPlusOne(this int x) 
    {
        Console.WriteLine(x + 1);
    }}
 
int foo = 0;foo.PrintPlusOne();

动态查阅

C# 4.0新增dynamic关键字，提供动态编程（dynamic programming），把既有的静态对象标记为动态对象，类似javascript, Python或Ruby。
dynamic关键字标记的字段被处理成一个特殊包装的object对象，它取消了CLI的编译时类型检查
dynamic calc = GetCalculator();int sum = calc.Add(10, 20);

具名参数与可选参数

public StreamReader OpenFile(
    string path,
    int bufferSize = 1024){...}
调用OpenFile时，顺序可以完全颠倒：
OpenFile(bufferSize: 4096, path: "foo.txt");

与COM组件交互

在C#中打开一个Word文件：
static void Main(string[] args) {
    Word.Application wordApplication = new   
       Word.Application() {Visible = true};     
    wordApplication.Documents.Open(@"C:\plant.docx",   
       ReadOnly: true);  
}
在C#中指定Excel的某一格文字：
excelObj.Cells[5, 5].Value = "This is sample text";

泛型的协变和逆变

C# 4.0支持协变和逆变，例如在泛型接口可以加上in、out关键字。
  public interface IComparer<in T>  
  {  
    int Compare(T left, T right);  
  }

  public interface IEnumerable<out T> : IEnumerable
  {
    IEnumerator<T> GetEnumerator();
  }

C# 7.0的特性

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

程序的执行

C#并不被编译成为能够直接在计算机上执行的二进制本地代码。与Java类似，它被编译成为中间代码（Microsoft Intermediate Language），然后通过.NET Framework的虚拟机——被称为通用语言运行库——执行。
所有的.Net编程语言都被编译成这种被称为通用中间语言的中间代码。因此虽然最终的程序在表面上仍然与传统意义上的可执行文件都具有“.exe”的后缀名。如果计算机上没有安装.Net Framework，那么这些程序会弹出对话框，要求用户下载.net framework。
在程序执行时，.Net Framework将中间代码翻译成为二进制机器码，从而使它得到正确的运行。最终的二进制代码被存储在一个缓冲区（Buffer）中。所以一旦程序使用了相同的代码，那么将会调用缓冲区中的版本。这样如果一个.Net程序第二次被运行，那么这种翻译不需要进行第二次，速度明显加快。

C# 的Hello World程序

下面是一个在命令行上输出Hello World的小程序，这种程序通常作为开始学习程序语言的第一个步骤： 
using System;namespace ConsoleApp1{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
        }
    }}