類型基礎
1 new操作符
MyClass c=new MyClass()
new運算子背後完成的工作如下:
1) 計算該類及其所有基類中定義的所有執行個體欄位(注意有兩個隱藏成員,一個是類型對象指標,一個是同步塊索引)需要的位元組數
2) 從託管堆中分配記憶體,所有位元組都設為0
3) 初始化兩個隱藏成員
4) 調用基類構造方法,然後調用類的構造方法
5) 返回對象的引用(某塊記憶體的別名)
2 類型轉換
調用對象的GetType()方法可以得到對象的類型,這個方法是非虛的(即不能被子類重寫)所以類型是不能被偽裝的
關於類型轉制
隱式轉換:子類對象可以隱式轉換成基類對象即 Father f=new Child() -----注意Child類繼承自Father類
顯示轉制:當兩種類型不是這種關係則要顯示類型轉換,Mather m=(Mather)(new Father()) ---即為(要轉換成的類型)要轉制的對象,由於顯示轉換不成功會拋異常,所以轉換前最好要進行判斷。
這時is和as操作符就上場了(它們是不會拋異常的)
is 判斷一個對象是否相容於指定類型,返回bool結果
Father f=new Fahter();
bool result=f is Mather();
如果 f為null或者對象不相容於指定類型則返回null,否則為返回true
as 強制對象轉製為指定類型對象,不能轉換則返回null
Father f=new Father();
Mather m=f as Mather();
兩者有什麼區別呢
假如
Father f=new Fahter();
Mather m=new Mather();
1) if( m is Father)
{
f=(Fahter)m;
}
2) f=m as Fahter;
上面就是不同的地方了,在2)的地方,如果轉換不成功,f為null,只要判斷f是否為null即可繼續後面的其它操作
而1)在if的時候會判斷一下,當它true時執行顯示轉換時,顯示轉換還會再進行內部的判斷,於是就要做兩次判斷
可想而知,當然是第2種效率高啦
3 命名空間
命名空間的作用就是為了防止類的重名,在不同的命名空間裡的類是可以重名的,這樣就不用想太多的類名了
(其實當程式編譯的時候,這個地方還是挺複雜的,想瞭解的話就去看書吧)
程式集與命名空間的關係
多對多的關係(一個程式集中可以有多個命名空間,一個命名空間可以在多個程式集中)
4 運行時的相互關係
clr via c# 書中的這個地方我覺得看這裡會讓人不解,最好就是結合視頻看,視頻就看馬sir的java部分(汗!看java的,但真的一樣可以用來解釋.net)