dynamic)。| 觀點 | 支持 var | 反對 var |
|---|---|---|
| 可讀性 | 減少型別名稱雜訊,專注變數名稱與邏輯 | 隱藏型別資訊,需滑鼠懸停/跳轉定義才知型別 |
| 命名風格 | 迫使使用描述性變數名 (如 var customerList = ...) | 誘導匈牙利式命名 (如 var lstCustomers = ...) |
| 重構彈性 | 變更回傳型別無需修改呼叫端變數宣告 | 可能掩蓋型別變更導致的語意錯誤 |
| 匿名型別 | **唯一可行選擇** (LINQ 投影、匿名物件) | — |
當型別從右側運算式顯而易見時使用 var;否則顯式宣告型別。
必須使用 var:匿名型別、LINQ 查詢結果。
var list = new List<Customer>();var stream = File.OpenRead(path);var dict = new Dictionary<string, List<int>>();var q = from c in ctx.Customers select new { c.Id, c.Name }; (匿名型別**必須**用 var)foreach (var item in collection) — 型別從集合元素型別推斷。using var fs = new FileStream(...);int count = 0; (而非 var count = 0; → 推斷為 int 但意圖不明)IEnumerable<Customer> customers = GetVipCustomers(); (強調介面而非具體實作)Stream stream = new MemoryStream(); (明確為基類型別)
// .editorconfig 設定
csharp_style_var_for_built_in_types = true:suggestion
csharp_style_var_when_type_is_apparent = true:suggestion
csharp_style_var_elsewhere = false:suggestion
var 是工具,非教條。核心原則:**讓程式碼意圖最清晰**。
- 型別資訊對理解邏輯關鍵時 → 顯式宣告。
- 型別從右側一目瞭然、或為匿名型別 → 果斷用 var。
團隊統一風格 (透過 .editorconfig/Code Review) 比個人偏好更重要。