這個東西在 .NET 發展以來,是一個很...不對盤的東西。該怎麼說,因為發展到 framework 2.0 以來,在型別一直就是採強型別的政策,怎麼會突然跑出這個東西出來,因為 var 的出現不就等於改走向型別不明確的那方面去....嗎?這時候一定要多個嗎...因為基於幾個方法幾乎就可證實。
在宣告上程式碼如下:
void ProcessMain()
{
//傳統的命名參數方法。
string x = "123456";
Response.Write(x.GetType());
//隱含型別命命方法,在命名同時就得給值。
var y = 123456;
Response.Write(y.GetType());
}
而光看智慧型標籤提示就知道什麼原因了。
雖然是用隱含數宣告,不過程式早就幫忙確認好, y 這個變數是 int 這個型別。也就是說 var 是由編譯器來幫你推斷實際型別。可是既然在撰寫的同時都知道型別,為啥還需要這個宣告方法?難道只是讓程式設計師貪圖方便投機取巧?感覺除了讓在原本宣告上求簡潔外,其中也為了一個理由,叫做匿名型別。
這時候可以先額外整理出一些重點,首先是 var 應用時機點大部都都在:
- 隱含型別區域變數的宣告
- 隱含型別陣列的宣告
- 匿名型別物件的宣告
‧隱含型別的區域變數的宣告
void ProcessMain()
{
//原本的命名方式
int x_Origno = 123456;
//隱含型別區域變數宣告
var x = 123456;
}
‧隱含型別陣列的宣告
void ProcessMain()
{
//原本的陣列宣告方式
int[] intList_Origno = new int[4];
intList_Origno[0] = 1;
intList_Origno[1] = 2;
intList_Origno[2] = 3;
intList_Origno[3] = 4;
//隱含型別陣列的宣告
var intList = new[] { 1, 2, 3, 4 };
}
‧匿名型別物件的宣告
void ProcessMain()
{
//原本的無匿名型別物件的宣告
//匿名型別物件的宣告
var wallet = new { NT100 = 1, NT500 = 1, NT1000 = 1, owner = "michael" };
}
而單看匿名型別的提示標籤,又可以清楚看到宣告 wallet 為匿名型別。
雖然隱匿型別的用意,表示型別不明,但不代表真的沒有型別的!只是暫時不用給定型別,在編譯的時候,.Net 會自動替匿名型別找到適合的型別名稱。
這時候又可以從網路上整理出幾個重點:
- 型別確定:型別雖然在命名時不用給定,而且用意原本也不明,但是在編譯完畢後就確定型別了。
- 屬性唯獨:匿名型別物件內的屬性是唯獨的,也就是給定之後是不可以再進行修改,否則在編譯時候會產生錯誤。
- 類別型別:匿名型別是屬於 Class 的型別,並且裡面是由內部不同屬性的型別所組成的。
- 類別限制:雖然屬於 Class 的型別,但唯一可以宣告的是屬性 ,而非方法或是事件。
- 搭配 var, new 關鍵字:匿名型別最常搭配 var 進行宣告,而後接 new 讓型別實體化。
- 可利用 LINQ:常利用 foreach 及 LINQ Epression 來進行各屬性的查詢並利用。
- 型別歸類:如果有多個匿名型別,其屬性的順序、數量都相同,編譯時便會自動視為同一種型別。
void ProcessMain()
{
//匿名型別物件的宣告
var wallet = new { NT100 = 6, NT500 = 2, NT1000 = 1, owner = "michael" };
//匿名型別的使用
Response.Write(string.Format("{0}皮夾內百元鈔有{1}張,五百元鈔有{2}張,千元鈔有{3}張。", wallet.owner, wallet.NT100, wallet.NT500, wallet.NT1000));
}
[.NET]快快樂樂學LINQ系列前哨戰-var與匿名型別
var (C# 參考)
沒有留言:
張貼留言