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!");
        }
    }}