varvar 讓編譯器依初始化運算式推斷型別,非動態型別,編譯期即確定。
var s = "Hello"; // string
var n = 42; // int
var cust = new Customer(); // Customer
var data = GetData(); // 依 GetData 回傳型別推斷
Customer c = new Customer() → var c = new Customer())。var 可自動適應,減少維護。var x = 1; x = "str"; 編譯錯誤)。允許為現有型別(含密封類別、介面、實值型別)「新增」靜態方法,呼叫語法如同實例方法。
static 類別中。static,第一個參數加 this 修飾詞指明擴充目標型別。
namespace MyExtensions
{
public static class StringExtensions
{
public static string NoSpaces(this string input)
=> input.Replace(" ", "");
}
}
using MyExtensions;
var s = "a b c".NoSpaces(); // "abc"
實例方法優先於同簽名擴充方法;擴充方法僅在找不到實例方法時被考慮。
允許在 new 運算式中直接設定公開屬性/欄位,無需對應建構函式。
// 傳統:需多載建構函式
var c = new Customer("John", "Doe");
// C# 3.0:單一無參數建構函式即可
var c = new Customer { FirstName = "John", LastName = "Doe" };
// 巢狀初始化
var order = new Order {
Customer = new Customer { Name = "John" },
Items = { new Item { Price = 10 }, new Item { Price = 20 } }
};
編譯器自動產生唯讀屬性的參考型別,型別名稱僅編譯器可見。
var point = new { X = 10, Y = 20 }; // 型別名稱如 <>f__AnonymousType0`2
Console.WriteLine(point.X); // 10
select new { ... } 投射結果。統一查詢語法,直接在 C# 中對任意 IEnumerable<T> 資料源(記憶體集合、XML、資料庫透過 LINQ to SQL/Entities)進行查詢。
var q = from c in customers
where c.OrderCount > 10
orderby c.Id
select c;
C# 3.0 這五大特性相輔相成:var 與匿名型別簡化 LINQ 結果處理;擴充方法豐富 IEnumerable<T> 查詢運算子;物件初始化器簡化投射建構。共同構建了現代 C# 函數式、聲明式程式設計的基石。