第二部分 設計類型:第4章 類型基礎

4.1全部類型都從System.Object派生

全部類型派生自System.Object,有一下公共實例方法:
1.Equals:兩個對象具備相同值返回true
2.GetHashCode:返回對象值的哈希碼。
3.ToString:默認返回類型完整名稱(this.GetType().FullName)
   核心類型Boolean和Int32重寫了該方法。爲方便調試能夠重寫返回對象各個字段的值字符串。
4.GetType:返回Type派生的一個對象的實例,指出調用GetType那個對象的類型。性能

System.Object的GetType方法返回的是「類型對象指針」地址,能夠判斷出真實的類型。

從System.Object派生的類型可訪問以下受保護方法:
1.MemberwiseClone:返回新實例(與this對象實例字段同樣)的引用。
2.Finalize:內存回收前會調用此虛方法。回收以前須要執行清理工做的類型應該重寫。

Employee e = new Employee("Param1");
CLR要求建立對象必須用new操做符,new操做符作的事情
1.計算類型和基類型全部實例字段須要的字節數。(包含「類型對象指針」和「同步塊索引」)
2.它從託管堆中分配須要的字節數,分配對象內存,分配的字節都設爲0。
3.初始化對象「類型對象指針」和「同步塊索引」成員
4.調用類型實例構造器,傳入實參,初始化實例字段。
new完成以上操做後,返回指向新建對象的引用(指針)

this

4.2類型轉換
CLR容許將對象轉換爲它的實際類型或基類型。
Object o = new EmPloyee(); //轉換爲基類型
EmPlyee e =(Emplyee)o; //轉換爲實際類型,有可能失敗,因此要顯示轉換。

使用C#的is和as操做符來轉型
is操做符檢查對象是否兼容於指定的類型,返回Boolean值(is不會拋異常,對象引用爲null返回false);
一般用法:
if(o is Employee){ //檢查一次
   Employee e = ()o; //再次檢查,判斷實際類型,再遍歷繼承層次結構進行覈對,消耗性能。推薦用as寫法
   //在if語句剩餘部分使用e
}

as操做符簡化寫法,並提高性能。
Employee e = o as Employee; //檢查是否兼容,兼容返回對象引用,不兼容返回null
if(e != null){
  //在if語句中使用e
}
以上只進行了一次類型校驗。上面is校驗2次。
as不會拋出異常。通常判斷是否爲null便可spa

 

 4.3命名空間和程序集
命名空間(namespace)用戶對相關類型進行邏輯分組,方便定位類型。命名空間可讓類型名稱更具惟一性。經過using指令,能夠省略類型前綴減小輸入量。

using爲類型或命名空間建立別名:
using WintellectWidget=Wintellect.Widget;

注:命名空間和程序集(實現了一個類型的文件)不必定是相關的。同一個命名空間中的各個類型多是在不一樣程序集中實現的。好比,System.IO.FileStream類型在MSCorLib.dll中實現,System.IO.FileSystemWatcher類型在System.dll中實現。指針

 

4.4運行時的相互聯繫
每一個方法的調用前(「序幕」)都會在棧中分配局部變量內存並將局部變量初始化(null,0),但訪問未顯示初始化局部變量會報錯:使用了未賦值的局部變量。棧是從上到下構建的。

對象包含:「類型對象指針」(指向類型對象)、「同步塊索引」和類型對象(包含字段和方法表)。調試

圖中紅框部分的方法表示JIT編譯(即時編譯)的代碼。對象

相關文章
相關標籤/搜索