如果把系統(tǒng)比做是個銀行卖词,那么值類型相當于現(xiàn)金,要用直接用吏夯;引用類型是存折此蜈,要用時得先去銀行取現(xiàn)即横。
值類型和引用類型都繼承自System.Object類。不同之處是幾乎所有的引用類型都是直接從System.Object繼承裆赵,而值類型則是繼承System.Object的子類System.ValueType類
1.什么是值類型东囚?
直接存儲數(shù)據(jù),多用于存儲不經(jīng)常改變的值战授。數(shù)據(jù)存儲在棧上页藻,只存儲變量的值。一般存儲在棧上陈醒。所有的值類型都是seal的惕橙,不能被繼承瞧甩。
int i = 10钉跷; int b = i;
CLR會先在棧上給i分配內(nèi)存空間,然后把10存到這個空間里肚逸。然后在棧上給b分配內(nèi)存空間爷辙,然后把i的值10
copy
到分配給b的內(nèi)存空間里。
2.值類型有哪些類別朦促?
- 簡單類型 :有符號整型膝晾,無符號整型,字符類型务冕,浮點類型血当,布爾類型
- 枚舉類型 :enum
- 結(jié)構(gòu)體類型 :struct
3.什么是引用類型?
存儲數(shù)據(jù)的引用(內(nèi)存地址)禀忆,數(shù)據(jù)存儲在堆中
A ref臊旭;//聲明類 A a = new A()//實例化類
聲明一個類時,CLR只會在棧中分配一小塊內(nèi)存用于存放地址箩退,并沒有為其分配堆上的內(nèi)存空間离熏。
new操作符返回對象的內(nèi)存地址(即指向?qū)ο髷?shù)據(jù)的內(nèi)存地址)所以實例化一個類時,CLR會為實例分配堆上的空間戴涝,并且會把該實例堆上空間的地址保存到棧上為a分配的內(nèi)存空間中滋戳。
4.引用類型有哪些類別?
- 類類型 : string / class
- 數(shù)組類型
- 接口類型
- 委托類型
5.為什么要有值類型啥刻?
為了用來存儲基本的生命周期比較短不經(jīng)常被改變的值數(shù)據(jù)奸鸯,直接操作內(nèi)存,查找起來比較方便可帽,減小系統(tǒng)開銷府喳。
6.為什么要有引用類型?
存儲得是對象的內(nèi)存地址蘑拯,需要先解析引用地址才能拿到對象钝满。但是可以直接操作同一對象兜粘,不會像值類型一樣每次都分配內(nèi)存空間消耗內(nèi)存。
7.生命周期什么時候結(jié)束弯蚜?
- 值類型 :離開函數(shù)體會被銷毀
- 引用類型 :沒有被引用的地方時
8.GC什么時候回收孔轴?
當生命周期結(jié)束后,GC會統(tǒng)一回收
9.為什么值類型繼承System.ValueType類卻不是引用類型碎捺?
System.ValueType本身是一個引用類型滚澜,由于它重寫了Equals()方法凤跑,所以對值類型按照實例的值來比較,而不是引用地址來比較。