var 不是一個類型,而是編譯期類型推斷的佔位符。編譯器根據初始化表達式的靜態類型,將 var 替換為實際類型,生成的 IL 與顯式聲明完全一致,運行期零開銷,保持 C# 強類型本質。
var i = 0; // int
var d = 3.14; // double
var s = "hello"; // string
var arr = new[] {1,2,3}; // int[]
var anon = new {Name="Tom", Age=25}; // 匿名類型
var list = new List<int>(); // List<int>
var x; ❌ 必須 var x = ...var x = null; ❌ 無法推斷類型var person = new { Name = "Alice", Age = 30, Skills = new[] {"C#", "SQL"} };
Console.WriteLine($"{person.Name} - {person.Age}");
// person 為編譯器生成的內部類型,僅能通過 var 訪問
int[] numbers = {5, 4, 1, 3, 9, 8, 6, 7, 2, 0};
var lowNums = from n in numbers where n < 5 select n;
// lowNums 類型為 IEnumerable<int>,var 極大簡化聲明
foreach (var n in lowNums) Console.Write(n + " ");
var items = new Dictionary<string, int> { {"A",1}, {"B",2} };
foreach (var kvp in items)
Console.WriteLine($"{kvp.Key}: {kvp.Value}");
// kvp 類型為 KeyValuePair<string, int>,無需手寫泛型參數
// 傳統寫法冗長
Dictionary<string, List<Tuple<int, DateTime>>> complex = new Dictionary<string, List<Tuple<int, DateTime>>>();
// var 寫法
var complex = new Dictionary<string, List<Tuple<int, DateTime>>>();
| 場景 | 建議 | 理由 |
|---|---|---|
| 基本類型 | 顯式聲明 | int i = 5 比 var i = 5 可讀性更高 |
| 匿名類型 | 必須用 var | 無具體類型名可寫 |
| LINQ 查詢 | 推薦 var | 類型複雜且明顯可推斷 |
| foreach 迭代 | 推薦 var | 泛型參數冗長,var 更清晰 |
| 工廠方法返回 | 視情況 | 若方法名明確語義可用 var,否則顯式聲明利文檔 |
以下代碼編譯後的 IL 完全等價:
// 源碼
var s = "text";
// IL 等價於
string s = "text";
使用 ildasm.exe 或反編譯工具可驗證:var 在元數據中無痕跡,純編譯期語法糖。
var 是動態類型 → ✅ 靜態強類型,編譯期確定var 有性能損耗 → ✅ IL 層面零差異var 等同 object → ✅ object 需裝箱/拆箱,var 保持原類型var 是 C# 向「語義清晰、樣板最小」演進的關鍵一步。正確使用原則:類型顯而易見時用 var,類型模糊不清時顯式聲明。配合匿名類型、LINQ、泛型,能讓代碼專注於業務邏輯而非類型儀式。