我們不關心對象內部是怎麼實現的,我們關心的是他提供給我什麼介面,有什麼操作。從技術上來說,結構屬於實值型別,而類屬於參考型別。結構不能指定繼承基類類型,類可以。不過結構和類都能實現介面。
一、應用場合
結構的應用場合:
一、自訂資料類型,資料成員是公開的,提供工具函數。
二、抽象的資料類型,資料成員是密封的,提供相關的資料操作函數。
總之,都是圍繞資料作文章。
類的應用場合:
一、提供一組類,形成一個有機整體,形成一個系統,類資料成員是密封的,只提供相互連信的函數介面。
類主要通過不同的類組成一個類間通訊的系統。而類自身是整個系統的一部分。
二、成員和可訪問性
作為抽象資料類型的工具,類和結構提供了豐富的封裝功能。
1.欄位定義資料成員,無封裝
2.屬性封裝欄位的訪問方式
3.函數提供可用操作
4.事件提供了處理訊息的模型
5.索引器封裝了資料集合
另外
建構函式、解構函式負責初始化和清理垃圾(在c#中需要使用IDispose模式)
對於成員,可以有三大類,1、類成員,所有執行個體共用;(static 修飾)2、對象公開成員;(public 修飾)3、對象私人成員。其中公開成員是最重要的,私人成員屬於內部實現細節。
公開成員是對象的特徵,因為對於使用者來說,只能通過公開成員和對象進行互動。可以通過提取公開成員,形成一個獨立介面,用來隔離具體的實現。這樣,設計者便可以提供不同的類實現給客戶。
三、泛型和介面
類和結構的共同點都是屬於實現,而介面屬於規範,用戶端應該避免直接接觸具體的實現,否則用戶端就需要根據實現的變化而變化,這明顯是不經濟的。但是類和結構又有差別,類側重行為,因此和介面更加搭配;而結構側重資料,而介面是沒有資料的,並且介面屬於參考型別,當結構作為實值型別轉化成介面,就會產生裝箱,會有效能問題。因此,介面一般不會配合結構來使用,而結構應該作為更加單純的資料單元,不應該添加太多功能性。如果需要設計功能豐富的組件,最好是基於類來實作。當結構作為資料單元,它要修改設計的餘地很少,因為資料單元的應用場合更多是被其他人修改,不具太多自主性。結論是結構自身便可以作為規範。
泛型是未完成的類型,因此提供了用戶端自訂類型的機會。泛型的每一個執行個體,都共用相同或者類似的代碼,那麼用戶端需要泛型的理由是什嗎?
c#是強型別的系統,就算邏輯上一樣,因為類型不同,在編譯器看來都是完全不同的代碼。當用戶端需要為不同類型採取相同的邏輯的時候,泛型就提供了一個快捷的,越過強型別限制的渠道。比如有個int + int 和 float + float在我們人類看來幾乎是一摸一樣,但是強型別的編譯器要求你重複書寫代碼,泛型能做到T + T,然後讓用戶端用可支援+操作的參數產生任何類型。
從用戶端的角度,它不在乎實現是怎樣的,它在乎的是介面是怎樣的。泛型對用戶端的意義在於強化了介面,從提供特定類型的介面到提供滿足特定條件的一定範圍內的類型的新型介面。這就讓可用性大大增強。(按照實際應用情況,我們應該將泛型視為常態,單一類型的介面才是特殊態)。