【公告】網站目前停止所有的課程訂閱服務,原有學員權益不受影響,造成不便還請見諒,我們正在打造更多課程以及圖書,包含 Python 為主的課程主題,未來將會合併且擴充目前的課程內容,提供全新課程訂閱服務,感謝學員的支持。

一致化的型別系統 - Object 類別

繼承是一種功能非常強大的機制,C# 支援完整的物件導向設計理論,提供「一致化型別系統」令所有型別統一繼承單一型別 - Object 以支援共通的基礎物件行為。

Objcet 提供了所有型別共有的基本屬性、方法及行為,例如所有的型別均提供了字串轉換方法 ToString ,甚至所有類別的預設建構式,亦是由 Objcet 所提供,因此當你設計的類別,不管是否明確繼承自特定的類別,或只是單純的建立一個新類別,完全沒有指定衍生的基礎類別,均會繼承 Object 的所有基本功能。

Object位於類別庫的System命名空間,提供了數個通用的方法成員,列舉如下:

方法
說明
Equals
用以判斷呼叫此方法的物件與指定的物件是否相同,是的話傳回 true ,否則為 false
GetHashCode
特定型別的雜湊函式,使用於雜湊演算與類似雜湊表的資料表結構。
GetType
取得目前實體物件的型別。
MemberwiseClone
建立目前 Object 的淺層複製。
ReferenceEquals
比較指定的物件是否參考至相同的實體。
ToString
此方法回傳一個字串,描述叫用此方法的物件名稱,若是叫用此方法為數值型別,直接將其轉換成為String型別。
Finalize
垃圾回收機制開始之前,提供物件進行物件資源釋放或是清空操作的機會。

當你建立一個類別,或是其他類別的衍生類別,均會直接或間接繼承上述的這些方法,其中定義為 virtual 的方法(例如ToString),亦支援覆寫為特定類別的版本。考慮以下這行程式碼:

class KObject { }

其中宣告一個空的類別,現在配置測試程式碼:

class Program
{
    static void Main(string[] args)
    {
        KObject ko = new KObject();
        string objectfullname = ko.ToString();
        Console.WriteLine(objectfullname);
        Console.ReadKey();
    }
}

建立KObject實體物件 ko,然後引用 ToString 方法,執行完畢輸出KObject的完整類別名稱。

既使沒有明確的設定,KObject 沒有任何內容的情況下,還是直接繼承 Object 類別,因此我自可以直接引用其中的 ToString 方法,這是 .NET 平台對物件導向設計的內建支援,透過繼承相同的頂層物件建構「一致化型別系統」。

除此之外,由於Object 為參考型別的基底型別,因此所有的參考型別均能夠轉換為 Object 型別物件,甚至實值型別亦能夠轉換為 Object 型別,以物件的形式作處理,Object與實值型別之間的轉換稱 Boxing 與 Unboxing。

Boxing

當實值型別被當作物件使用的時候,你必須使用 Boxing 轉換,例如以下的程式片段:

int x  = 10 ; 
object obj =(object) x ; //boxing

第1行宣告一個int實值型別變數 x ,接下來對 x 進行了 Box 轉換,將一個實值型別轉換成為參考型別,並且儲存至 obj 變數當中。

Unboxing

Unboxing 為 Boxing 的逆向操作,將物件型別明確的轉換成為實值型別,如下式,第二行將obj重新轉換成為 int 整數型別,Unboxing 需要藉由使用明確轉型來完成。

object obj =10 ; 
int j = (int)obj;  // Unboxing


沒有留言: