| 相同點 | 不同點 |
|---|---|
| 可聲明任意類型區域變量 | 僅告訴編譯器「根據初始化表達式推斷類型」 |
| 只能用於區域變量(含 foreach/using/for) | |
| 非新類型,純關鍵字/佔位符 |
var integer = 10;
var name = "edisundong";
var numbers = new int[] { 1, 2, 3 };
// 編譯器推斷等價於:
// int integer = 10;
// string name = "edisundong";
// int[] numbers = new int[] { 1, 2, 3 };
var x; x = 10; // ❌ Implicitly typed locals must be initialized
var i = 10; i = "str"; // ❌ Cannot implicitly convert 'string' to 'int'
var x = null; // ❌ Cannot assign '' to implicitly typed local
var coll = new Hashtable(); // ✅
class C { private var x = 1; } // ❌ 'var' may only appear within local variable declaration
var person = new { Name = "Tom", Age = 25 };
var query = from c in customers where c.City == "London" select c;
// query 類型為 IEnumerable,var 極大簡化
foreach (var item in items) { ... }
// item 類型自動推斷,無需手寫泛型參數
var dict = new Dictionary>>();
使用 ildasm.exe 查看:var 在元數據中無任何痕跡,編譯器根據初始化表達式將其替換為確切類型。運行期性能與顯式聲明完全一致。
類型顯而易見時用 var,類型模糊不清時顯式聲明。
var i = 5 不如 int i = 5 清晰)var result = DoSomething() 降低可讀性)var 是 C# 向「意圖導向編程」邁出的關鍵一步:讓代碼表達『做什麼』而非『是什麼類型』。掌握五大鐵律、識別高頻場景、遵循可讀性原則,即可駕馭這個看似簡單卻威力巨大的關鍵字。