沒錯,又是類別,今天要來講隱含型別與匿名類別。
隱含型別區域變數如同您自己宣告的類型一樣是強型別,但是編譯器會判斷類型。
至從會 var 後,我在宣告類型時就只用它了呢。
簡單說就是它會自動判斷類別,無論是簡單類別、陣列又或者自定義類別等等的。因為是在編譯時期就決定好了,所以是強型別的變數,不會在執行時期發生型別相關問題,與之相反的是 dynamic,這是在執行時期才會決定型別,所以初學者在撰寫時容易發生不預期的錯誤。
int number = 0;
var numberv = 0;
string str = "Mio";
var strv = "Mio";
int[] arr = new int[3]{ 1, 2, 3 };
var arrv = new int[3]{ 1, 2, 3 };
Coordinate c1 = new Coordinate (12.156m, 7.195m);
var cv = new Coordinate (12.156m, 7.195m);
可以看到 var 可以取代所有的類別名稱,超級好用,但為了讓初學者一開始先打好底,所以起初沒有去說明。有些很方便的東西,如果沒有基礎知識的話,很容易看不懂在寫啥毀,為什麼可以這樣寫等等。
匿名類型提供一個便利的方法,將一組唯讀屬性封裝成一個物件,而不需要事先明確定義類型。
有了 var 我們才可以使用匿名類型,不然在明確定義類型前,沒有人知道是什麼類型。
var member = new { ID = 0, Name = "Mio" };
Console.WriteLine (member);
可以看到印出來的東西跟昨天講的完全不一樣,因為匿名類型沒有類型名稱,所以編譯器會重寫 ToString() 方法,變成傳回 PropertyName = value
這樣的對照表。
若是多筆資料的話
var members = new [] { new { ID = 0, Name = "Mio" }, new { ID = 1, Name = "Miffy" } };
foreach (var member in members) {
Console.WriteLine (member);
}
foreach 的變數也可以用 var 取代,但方法那種需要判斷型別的地方就不行,還有就是 array 裡面的所有類別都必須相同,否則會錯誤。
若是有 array 成員的話
var member = new { ID = 0, Names = new string[] { "Mio", "Miffy" } };
foreach (var name in member.Names) {
Console.WriteLine ($"ID = {member.ID}, Name = {name}");
}
var 有多好用我不用再說了,現在就可以把之前練習的程式碼全改成 var 了,但如果程式碼有出錯,我會建議你先把 var 改回成明確類型,會比較好偵錯。
匿名類型基本上目前都還用不到,介紹後面的內容才會出現,現在先看過有個印象就好。
感謝閱讀。
參考連結
var (C# 參考) | Microsoft Docs
匿名類型 (C# 程式設計手冊) | Microsoft Docs