C# 3.0 增加了 var 關鍵字,你可以用它來宣告隱含型別,例如:
int i = 10;
var j = 10;
這兩行的作用完全相同,連編譯出來的 IL code 也都一個模樣:
.locals init (
[0] int32 i,
[1] int32 j)
L_0001: ldc.i4.s 10
L_0003: stloc.0
L_0004: ldc.i4.s 10
L_0006: stloc.1
因為 var 變數其實是靜態繫結的變數,亦即編譯時期就已經決定變數型別了。
那麼編譯器如何決定型別?透過你指定給變數的初始值來推測。因此,使用 var 變數有個基本前提:一定要給初始值。否則編譯時會出現錯誤:Implicitly-typed local variables must be initialized。
再看一個 var 的範例:
其他限制
除了必須給定初始值,var 還有下列限制:
有一種情況一定得用 var,就是當你使用匿名型別的時候。匿名型別在下一篇筆記再來談。
int i = 10;
var j = 10;
這兩行的作用完全相同,連編譯出來的 IL code 也都一個模樣:
.locals init (
[0] int32 i,
[1] int32 j)
L_0001: ldc.i4.s 10
L_0003: stloc.0
L_0004: ldc.i4.s 10
L_0006: stloc.1
因為 var 變數其實是靜態繫結的變數,亦即編譯時期就已經決定變數型別了。
那麼編譯器如何決定型別?透過你指定給變數的初始值來推測。因此,使用 var 變數有個基本前提:一定要給初始值。否則編譯時會出現錯誤:Implicitly-typed local variables must be initialized。
再看一個 var 的範例:
var numbers = new[] { 10, 20, 30, 40 }; foreach (var x in numbers) { Console.WriteLine(x); }編譯器將會推測 numbers 的型別為整數陣列(int32[]),迴圈計數值 x 則為 int32。注意在建立此整數陣列時,使用的語法是 new[] 而不是一般的 new[int]。此外,使用 var 宣告陣列時,陣列的所有元素都必須是同一型別,否則編譯器無法決定該用甚麼型別。因此,下面這行寫法將無法通過編譯:
var mixedAry = new[] { 10, "abc" }; // Error! 編譯器無法決定該用什麼型別.
其他限制
除了必須給定初始值,var 還有下列限制:
- 只能用在區域變數。函式的參數也不能宣告為 var。
- 每一個 var 宣告只能有一個變數,所以你不能這樣寫:
var i = 10, j = 20; // 編譯錯誤:Implicitly typed locals cannot have multiple declarators.
- 如果你在同一塊命名空間裡面定義了一個名為 var 的類別,那麼編譯器會優先使用你定義的類別名稱,亦即在此命名空間內,程式碼當中的 var 都被視為類別,而非 var 關鍵字。
有一種情況一定得用 var,就是當你使用匿名型別的時候。匿名型別在下一篇筆記再來談。
沒有留言: