安裝 VS2008 後,ReSharper 建議將區域變數宣告改為 var。這是 C# 3.0 (.NET 3.5) 引入的語法糖,編譯器根據初始化運算式推斷型別,並非動態型別,生成的 IL 與顯式宣告完全相同。
var i = 10; // int
var s = "hello"; // string
var arr = new[] {1,2,3}; // int[]
var anon = new { Name = "Tom", Age = 25 }; // 匿名型別
var dict = new Dictionary(); // 明確建構型別
| 特性 | C# var | JavaScript var |
|---|---|---|
| 型別推斷 | 編譯期靜態 | 執行期動態 |
| 可變性 | 不可變(強型別) | 可隨時改型別 |
| 作用域 | 區域變數、for/foreach/using | 函數/全域 |
| 必須初始化 | 是 | 否 |
// 錯誤 1:未初始化
var x; x = 10; // CS0815: Implicitly typed locals must be initialized
// 錯誤 2:指派 null
var y = null; // CS0815: Cannot assign to implicitly-typed local
// 錯誤 3:欄位/屬性使用
class C { var z = 1; } // CS0825: var may only appear within a local variable declaration
// 錯誤 4:自我參考初始化
var self = self; // CS0820: Cannot use variable before assignment
var n = 10;
n = "abc"; // CS0029: Cannot implicitly convert type 'string' to 'int'
編譯期即攔截,確保強型別安全。
select new { c.Name, c.Age } 必須用 var。var dict = new Dictionary>(); 簡潔易讀。var q = from c in ctx.Customers where c.City=="Taipei" select c; 型別為 IQueryable<Customer>。foreach (var item in list)。int i = 0; 比 var i = 0; 更明確,團隊可自訂風格規範。var 是編譯期語法糖,不影響執行效能、不改變強型別本質。善用於匿名型別、複雜泛型、LINQ 變數可提升可讀性;簡單內建型別建議顯式宣告以利程式碼審閱。團隊應在編碼規範中明確定義使用邊界。