c# 學習–類型基礎

來源:互聯網
上載者:User

類型基礎
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)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.