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

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

 

一 值類型和引用類型數組

a)面嚮對象語言最明顯的特徵即是:萬物皆對象。但早期的面嚮對象語言卻由於這一點存在性能上的問題。由於任何變量都要在堆上分配。CTS經過將數據類型分爲值類型和引用類型解決了這個問題。安全

 

b) 值類型編程語言

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

 

c)引用類型指針

引用類型包括類、數組、委託、接口;這類數據會保存在堆(Heap)上;能夠爲空;引用類型其實是類型安全的指針,類型安全意味着指針必定會指向堆上已經存在的對象,操做數據時,操做的是該指針。對象

 

二 裝箱和拆箱繼承

裝箱和拆箱在保證「萬物皆對象」的前提下,作到了對性能的提高。接口

a) 裝箱就是將一個值類型的變量轉換爲引用類型;拆箱則反之。這一律念最重要的地方在於:「它使一個事物只有在須要是對象的時候才做爲對象」。好比一個Int32類型的變量,保存在棧上,但它能夠傳遞給任何從Sytem.Object衍生的對象,而實際上它只是一個保存在棧上、佔用了4個字節的值。it

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關鍵字進行轉換,使用這種方式就行向下轉換時,運行時轉換失敗不會報錯,會賦空值,因此要注意作好非空判斷。

相關文章
相關標籤/搜索