C♯

C#是微軟推出的一種基於.NET框架和後來的.NET的、面向物件的高階程式語言。C#是一種由C和C++衍生出來的面向物件的程式語言。它在繼承C和C++強大功能的同時去掉了一些它們的複雜特性，使其成為C語言家族中的一種高效強大的程式語言。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公司的首席研發設計師安德斯·海爾斯伯格上，發表新的語言C#。C#語言取代了Visual J++，語言本身深受Visual Basic、Java、C和C++ 的影響。語言特性.相對於C和C++，這個語言在許多方面進行了限制和增強：C# 2.0的特性.針對於.NET SDK 2.0，C# 的新特性有：部分類.分部類別將類別的實現分在多個檔案中。該概念於C# 中首次出現，除了能將一個類別的成員分開存放，還使ASP.NET中的程式碼後置得以實現。程式碼後置實現了HTML程式碼和後臺互動程式碼的分離。file1.cs:public partial class MyClass1public void MyMethod1()// implementationfile2.cs:public partial class MyClass1public void MyMethod2()// implementation}分部類別這個特性允許將一個類別的編寫工作分配給多個人，一人寫一個檔案，便於版本控制。它又可以隔離自動生成的程式碼和人工書寫的程式碼，例如設計窗體應用程式時。泛型.泛型，或引數化型別，是被C#支援的.NET 2.0特性。不同於C++模版，.NET引數化型別是在執行時被例項化，而不是編譯時，因此它可以跨語言，而C++模版卻不行。C#泛型類在編譯時，先生成中間程式碼IL，通用型別符號T只是一個佔位符；在例項化類時，根據實際資料型別代替T並由即時編譯器生成原生代碼，其中使用了實際的資料型別，等同於用實際型別寫的普通的類。它支援的一些特性並不被C++模版直接支援，比如約束泛型引數實現一個介面。另一方面，C# 不支援無型別的泛型引數。不像Java中的泛型，在CLI虛擬機器中，.NET generics使用具化生成泛型引數，它允許最佳化和儲存型別資訊。泛型類中，可以用where關鍵字對引數型別實現約束。例如：class Nodewhere T : Stack, IComparable, new(), classwhere V : Stack, struct上述表示T和V必須是Stack類或其派生類，T必須繼承了IComparable介面、有無參建構函式、是引用型別；V必須是值型別。泛型不僅能作用在類上，也可單獨用在類的方法上，稱為“泛型方法”。泛型類的靜態成員變數在相同封閉類間共享，不同的封閉類間不共享。泛型類中的方法過載，引數型別T和V在執行時確定，不影響這個類透過編譯。C#的泛型是在例項的方法被呼叫時檢查過載是否產生混淆，而不是在泛型類本身編譯時檢查。特別地，當一般方法與泛型方法具有相同的簽名時，會覆蓋泛型方法。靜態類別.靜態類別它不能被例項化，並且只能有靜態成員。這同很多過程語言中的模組概念相類似。迭代器.一種新形式的迭代器它提供了函數語言程式設計中的generator，使用codice_1類似於Python中使用的codice_2// Method that takes an iterable input (possibly an array)// and returns all even numbers.public static IEnumerable numbers)foreach (int i in numbers)if (i % 2 == 0) yield return i;注意事項：匿名方法.匿名方法類似於函數語言程式設計中的閉包。匿名方法是透過使用 delegate 關鍵字建立委託例項來宣告的。例如：delegate void NumberChanger(int n);NumberChanger nc = delegate(int x)Console.WriteLine("Anonymous Method: {0}", x);public void Foo(object parameter)// ...ThreadPool.QueueUserWorkItem(delegate// anonymous delegates have full access to local variables of the enclosing methodif(parameter == ...)// ...});委託的協變和逆變.委託簽名的協變和逆變,屬性訪問器可以被單獨設定訪問級別.例子：string status = string.Empty;public string Statusget { return status; } // anyone can get value of this property,protected set { status = value; } // but only derived classes can change it可空型別.可空型別允許設定codice_4給任何類型別。int? i = null;object o = i;if(o == null)Console.WriteLine("Correct behaviour - runtime version from September 2005 or later");elseConsole.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模式到通用語言執行庫中e.Linq.語言整合查詢： 上下文相關關鍵字"codice_6, codice_7, codice_8"可用於查詢SQL、XML、集合等。這些識別符號在LINQ上下文中被作為關鍵字，但是它們的增加不會破壞原有的名為codice_6、codice_7或codice_8的變數。型別初始化器.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 };假設codice_12實現了codice_13且有一個codice_14方法method匿名型別.var x = new { Name = "James" };區域性變數型別推斷.區域性變數型別推斷：var x = new Dictionary $"{y}{x}"; // Funcvar h = "test".GetHashCode; // FuncCallerArgumentExpression.使用CallerArgumentExpression這個attribute，編譯器會自動填充呼叫引數的表示式字串，例如：void Foo(int value, [CallerArgumentExpression("value")] string? expression = null)Console.WriteLine(expression + " = " + value);當你呼叫 Foo(4 + 5) 時，會輸出 4 + 5 = 9。這對測試框架極其有用tuple 的混合定義和使用.int y = 0;(var x, y, var z) = (1, 2, 3);於是 y 就變成 2 了，同時還建立了兩個變數 x 和 z，分別是 1 和 3 。介面支援抽象靜態方法..NET 6中這個特性為preview特性。在方法上指定 AsyncMethodBuilder.在方法上用 [AsyncMethodBuilder(...)]，來使用自己實現的 async method builder，代替自帶的 Task 或者 ValueTask 的非同步方法構造器。有助於實現零開銷的非同步方法。line 指示器支援行列和範圍.以前 #line 只能用來指定一個檔案中的某一行，現在可以指定行列和範圍：// 比如 #line (1, 1) - (2, 2) 3 "test.cs"巢狀屬性模式匹配改進.以前在匹配巢狀屬性的時候需要這麼寫：現在只需要簡單的：改進的字串插值.實現接近零開銷的字串插值。Source Generator v2.包括強型別的程式碼構建器，以及增量編譯的支援等程式的執行.C#通常不被編譯成為能夠直接在計算機上執行的二進位制原生代碼。與Java類似，它被編譯成為中間程式碼，然後透過.NET Framework的虛擬機器——被稱為-{zh-hans:通用語言執行庫;zh-hant:通用語言執行層}-——執行。所有的.Net程式語言都被編譯成這種被稱為通用中間語言的中間程式碼。因此雖然最終的程式在表面上仍然與傳統意義上的可執行檔案都具有“.exe”的字尾名。如果計算機上沒有安裝.Net Framework，那麼這些程式會彈出對話方塊，要求使用者下載.net framework。在程式執行時，.Net Framework將中間程式碼翻譯成為二進位制機器碼，從而使它得到正確的執行。最終的二進位制程式碼被儲存在一個緩衝區中。所以一旦程式使用了相同的程式碼，那麼將會呼叫緩衝區中的版本。這樣如果一個.Net程式第二次被執行，那麼這種翻譯不需要進行第二次，速度明顯加快。標準化.微軟公司已經向ECMA申請將C#作為一種標準。在2001年12月，ECMA釋出了ECMA-334 C#語言規範。C#在2003年成為一個ISO標準。現在有一些獨立的實現正在進行，包括：示例.C# 的Hello World程式.下面是一個在-{zh:命令列;zh-hans:命令列;zh-hant:命令提示字元}-上輸出Hello World的小-{zh:程式;zh-hans:程式;zh-hant:程式}-，這種-{zh:程式;zh-hans:程式;zh-hant:程式}-通常作為開始學習-{zh:程式;zh-hans:程式;zh-hant:程式}-語言的第一個步驟：using System;namespace ConsoleApp1class Programstatic void Main(string[] args)Console.WriteLine("Hello World!");實現.微軟正在引領開源參考 C# 編譯器和工具集的開發。 第一個編譯器 Roslyn編譯成中間語言；它們最終融合為一個開源實現：.NET 5.0。 在 .NET Framework 4.6 中，新的 JIT 編譯器取代了前者。其他 C# 編譯器：遊戲引擎 Unity 使用C# 作為其主要指令碼語言。由於Microsoft 捐贈了 24,000 美元， Godot 遊戲引擎實現了一個可選的 C# 模組。