C Sharp語法

C Sharp是編寫該語言程式的一套規則。也適用於.NET Framework and Mono。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關鍵字對引數型別實現約束。例如：public class Node where T : Stack, IComparable, new(),class where 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 (startLine, startChar) - (endLine, endChar) charOffset "fileName"// 比如 #line (1, 1) - (2, 2) 3 "test.cs"巢狀屬性模式匹配改進.以前在匹配巢狀屬性的時候需要這麼寫：現在只需要簡單的：改進的字串插值.實現接近零開銷的字串插值。Source Generator v2.包括強型別的程式碼構建器，以及增量編譯的支援等