1. 程式人生 > >《Inside C#》筆記(三) 數據類型

《Inside C#》筆記(三) 數據類型

idc 類型安全 類型轉換 核心 技術 運行 派生類 最重要的 指針

數據類型系統是一門編程語言的核心。.NET系列的語言使用統一的數據類型系統CTS(Common Type System)。所有的數據類型都繼承自System.Object。

一 值類型和引用類型

a)面向對象語言最明顯的特征便是:萬物皆對象。但早期的面向對象語言卻因為這一點存在性能上的問題。因為任何變量都要在堆上分配。CTS通過將數據類型分為值類型和引用類型解決了這個問題。

b) 值類型

值類型包括基元類型(Primitive Type,包括int,double,byte等)、枚舉和結構體;這些類型的變量會保存在棧(stack)上;不能為空;操作數據時,直接操作棧上的值。

c)引用類型

引用類型包括類、數組、委托、接口;這類數據會保存在堆(Heap)上;可以為空;引用類型實際上是類型安全的指針,類型安全意味著指針一定會指向堆上已經存在的對象,操作數據時,操作的是該指針。


二 裝箱和拆箱

裝箱和拆箱在保證“萬物皆對象”的前提下,做到了對性能的提升。

a) 裝箱就是將一個值類型的變量轉換為引用類型;拆箱則反之。這一概念最重要的地方在於:“它使一個事物只有在需要是對象的時候才作為對象”。比如一個Int32類型的變量,保存在棧上,但它可以傳遞給任何從Sytem.Object衍生的對象,而實際上它只是一個保存在棧上、占用了4個字節的值。

b) 值類型有很多種,但引用類型可以認為只有System.Object一種,所以裝箱的時候,值類型的轉換目標是明確的,在將值類型賦值給引用類型時會自動進行裝箱。但拆箱時,需要人為指定要將引用類型轉換為哪種值類型。


三 System.Object

System.Object是所有對象的基類,所有對象都默認繼承了System.Object類的方法。System.Object類具有如下幾個方法:

public方法:

技術分享

Equals:比較變量是否相等,如果兩個變量引用同一個對象,這兩個變量相等;對於值類型來說,如果類型和值都相等,則認為變量相等。

GetHashCode:計算對象的哈希值時用。

GetType:反射時,用來取得對象的類型。

ToString:默認返回對象的名稱。

ReferenceEquals:本書比較早,這個屬性應該是後來版本的.NET中添加的,用於比較是否引用同一個對象。

protected方法:

技術分享

Finalize:GC進行垃圾回收時用到。

MemberwiseClone:用於進行淺拷貝。

四 CTS類型與C#類型的對應

技術分享


五 類型轉換

根據裏氏轉換原則,可以使用派生類來替換基類。如果假設基類為Employee,派生類為ContractEmployee:

a) 向上轉換(upcast) 將派生類賦值給基類時進行向上轉換,這種轉換可自動進行(隱式轉換)。

Employee e=new ContractEmployee();

b) 向下轉換(downcast) 將基類轉換為派生類時進行的是向下轉換,需要顯式轉換。

技術分享

這樣的寫法編譯可以通過。只有在運行時才可以確認轉換是否能夠成功,如果轉換失敗,會拋出System.InvalidCastException異常。

另外,還可以使用as關鍵字進行轉換,使用這種方式就行向下轉換時,運行時轉換失敗不會報錯,會賦空值,所以要註意做好非空判斷。

《Inside C#》筆記(三) 數據類型