2017年2月7日 星期二

C# 筆記:使用 var 宣告隱含型別

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 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,就是當你使用匿名型別的時候。匿名型別在下一篇筆記再來談。

from : http://huan-lin.blogspot.com/2009/01/implicit-type-declaration-in-c-30.html

沒有留言:

張貼留言