C# 3.0 引入 var 關鍵字,讓編譯器從初始化運算式推斷區域變數型別,減少冗長型別宣告,配合匿名型別與 LINQ 使用極為強大。
基本語法與等價寫法
var i = 5; // int i = 5;
var s = "Hello"; // string s = "Hello";
var d = 1.0; // double d = 1.0;
var arr = new int[] {1,2,3}; // int[] arr = new int[] {1,2,3};
var dict = new Dictionary<int, Order>(); // 完整泛型宣告
限制規則
| 規則 | 說明 | 錯誤範例 |
| 必須初始化 | 宣告時即賦值 | var x; |
| 初始化運算式不可為 null | 編譯期需推斷具體型別 | var x = null; |
| 不可為集合初始化器本身 | 需用 new 運算式 | var x = {1,2,3}; |
| 多變數宣告型別需一致 | 單一 var 宣告多變數時 | var a = 1, b = "s"; |
| 僅限區域變數 | 不可用於欄位、屬性、參數 | class C { var x = 1; } |
進階應用場景
foreach 迴圈變數
var numbers = new[] {1, 3, 5, 7, 9};
foreach (var n in numbers) Console.WriteLine(n); // n 推斷為 int
using 區塊資源取得
using (var fs = new FileStream("data.bin", FileMode.Open)) { ... }
for 迴圈初始化
for (var i = 0; i < 10; i++) { ... }
匿名型別 (唯一命名方式)
var person = new { Name = "Tom", Age = 25, Skills = new[] {"C#", "SQL"} };
// person 型別為編譯器生成的匿名型別,只能用 var 宣告
LINQ 查詢結果
var query = from p in products
where p.Price > 100
select new { p.Name, p.Price };
// query 型別為 IEnumerable<匿名型別>
最佳實務建議
- 型別明顯時使用 var:右側有
new Type() 或字面常數
- 型別不明顯時顯式宣告:
var result = GetData(); 建議改為 DataTable result = GetData();
- 基本型別建議顯式宣告:
int count = 0; 比 var count = 0; 更清晰
- 團隊統一風格:制定編碼規範避免爭論
編譯器實作細節
- 編譯期完成型別推斷,IL 中無
var 痕跡
- 推斷結果為靜態型別,非動態型別 (
dynamic)
- 不影響執行效能,純語法糖
- 上一篇文章: C# 所見即所得設計器架構設計:文檔物件模型與視覺化編輯核心技術
- 下一篇文章: C# 委派 深度解析:從定義、實例化到調用的完整圖解
Copyright ©
程式碼之家 All Rights Reserved