C# 數據類型(3)
動態類型 dynamic types
動態類型是后來引進的,他其實是一個static type,但是不像其他的靜態類型,編譯器不會檢查你到底是啥類型(也不會檢查你能不能去call某個’method’),這就給了我們可趁之機(但是同時也給我們帶來了風險)
上圖這個例子,我們dynamic 了3個變量 ,一個沒初始化(null) 一個是string 一個是int
當我們嘗試去輸出d2 d3的Length的時候,編譯器是不會報錯的,因為是你的類型是dynamic,編譯器不去檢查你
只有在解釋器執行到這一行的時候,報錯了,int類型的數據是沒有Length屬性的
所以我們要清楚的知道自己要干什么,有什么風險,不然查問題費勁。
動態類型我們是可以改變它的類型的,比如我前面剛給a賦值了123,緊接著我就可以給a賦值”hello world!”,編譯器自己會把a的類型換過來的,這就是dynamic的方便之處
前面說了,dynamic的危險之處就是編譯器不會去檢查你調用的某個方法或者某個屬性存在不存在,能不能調用,只有在解釋器解釋到那一行的時候才會報錯,這就是一顆隱藏的雷,不安全
為了保險起見我們盡量少用這個類型,用的多的地方也就是COM接口和json或者xml交換數據的時候用。
ExpandoObject
上面我們說到dynamic,使用起來還是很方便的,其中有一點 “不能給dynamic的量 動態的 增加屬性”dynamic d1;d1.Age=42
上面這樣是不行的,不能動態的想加就加,屬性都是定好了的,不能無中生有
要想無中生有,其實也有辦法,定義的時候實例化成ExpandoObject
ExpandoObject其實使用字典接口實現的IDictionary<string, object>,因此(ci)可以迭(die)代取key和(he)value
匿名類型Anonymous Types
以前我們都是先定義好class,class里面有屬性/方法等,然后實例化這個類 得到一個對象
匿名類型可以讓我們不用定義class 就可以創造一個對象了,神奇,但這并不意味著class要退出歷史舞臺了,因為匿名類型畢竟是有限制的
限制歸限制,某些情況下匿名類型是真香
前面說了,匿名類型 得用var 關鍵字。創建對象的時候,和class實例化差不多,只是沒寫class的名字
看這個例子,其實很簡單的吧,比class好用,小巧迅速快捷
但是匿名類型是有限制的:
1. 只有屬性,沒有方法。畢竟不是真正的類,沒有方法和field
2.一旦對象被實例化以后,不能再添加屬性
3.屬性是readonly,一旦對象(xiang)被創建(jian)后(hou),這(zhe)個對象(xiang)的屬性就再也改(gai)不了(le)了(le)
但是匿名函數還是很實用的:
1. 有個很復雜的對象,你想簡化它(比如說為了你想把這個對象發送給瀏覽器)
2.對象含有敏感信息(xi),你不想讓用戶(hu)知道

這里(li)先(xian)獲得exe的信息,然(ran)后用個匿名類型去獲取它的 文件名 和 文件大(da)小