天天看點

元件類與普通類的差別

  元件類産生dll ,普通類不會。

  分開編譯友善,程式小而且一個人做沒必要了。

  理論上具備一定重用性的類都可以稱為元件。

  沒有太大差別,應該說是一樣的,元件類需要實作幾個特定的方法。

  元件類派生于System.ComponentModel.Component類,是以它具有Component基類的所有特性,元件類具有設計器,可用于以可視化的方式為元件添加特性。

  元件類具有IDE特性,允許使用者在設計時修改其屬性。

  元件不一定都是可見的,不一定都可以以可視化的方式設定特性,隻有控件才是可見的,以可視化的方式提供給使用者,同使用者進行互動。一個控件必定是一個元件;但一個元件不一定是一個控件。

  應該說元件類的可重用性是比普通類要好的。

  元件是所有控件的基類,經如一個Button就是從System.ComponentModel.Component繼承而來,一般來說一個元件沒有界面外觀,而一個控件是有外觀的.如果要寫一個有外表的自定義控件可以從UserControl繼承就行了.如果是Control或Component則沒有界面的.

  如果您的類使用外部資源但不用于設計圖面,則實作 System.IDisposable,或者從直接或間接實作 IDisposable 的類派生。

  如果您的類要用于設計圖面(如 Windows 窗體或 Web 窗體設計器),則實作 System.ComponentModel.IComponent,或者從直接或間接實作 IComponent 的類派生。請注意,IComponent 擴充了 IDisposable,是以 IComponent 類型始終是 IDisposable 類型。與不是 IComponent 的 IDisposable 類型相比,IComponent 類型的性能系統開銷要小。但 IDisposable 類型的這一不足通常可由在設計時和運作時安置 IComponent 的能力來彌補。(在本主題的後面部分将對該安置功能進行說明)。

  如果需要由引用封送的可設計的(用于設計圖面)類,則可從 System.ComponentModel.Component 派生。Component 是由引用封送的 IComponent 類型的基實作。

  如果需要由值封送的可設計類,則可從 System.ComponentModel.MarshalByValueComponent 派生。MarshalByValueComponent 是由值封送的 IComponent 類型的基實作。

  如果需要在對象模型層次結構中引入 IComponent 類型,但由于是單繼承,而無法從 Component 或 MarshalByValueComponent 這樣的基實作派生,則實作 IComponent。

  如果需要提供使用者界面的可設計類,則該類是控件。控件必須直接或間接從下列基控件類之一派生:System.Windows.Forms.Control 或 System.Web.UI.Control。

  注意 如果您的類既不是可設計類,也不儲存外部資源,則不需要 IComponent 或 IDisposable 類型。

  下面是元件、控件、容器和站點的定義。

  元件

  在 .NET Framework 中,元件是指實作 System.ComponentModel.IComponent 接口的一個類,或從實作 IComponent 的類中直接或間接派生的類。在程式設計中,"元件"這個術語通常用于可重複使用并且可以和其他對象進行互動的對象。.NET Framework 元件滿足這些一般要求,另外還提供諸如控制外部資源和設計時支援等功能。

  控制外部資源

  IComponent 接口擴充了 System.IDisposable 接口,在後者的協定中有一個名為 Dispose 的方法。在其 Dispose 方法實作中,元件必須顯式釋放外部資源。與垃圾回收過程中發生的預設、不确定的清理相比,這提供了一個确定的方法來釋放資源。開發人員必須在整個包容層次結構中傳播 Dispose 以確定元件的子級也釋放資源。另外,派生的元件必須調用其基類的 Dispose 方法。

  注意 即使通過 Dispose 提供對資源的顯式控制,也應該始終通過終結器(析構函數)提供隐式清理,以防使用者未能對您的元件調用 Dispose 時資源永久洩漏。

  設計時支援

  在 .NET Framework 中,元件的一個重要功能就是它們是可設計的,這意味着作為元件的類可用于快速應用程式開發 (RAD) 環境(如 Visual Studio .NET)中。可将元件添加到 Visual Studio .NET 的工具箱中,也可将元件拖放到某個窗體上,還可以在設計圖面上對元件進行操作。請注意,對 IComponent 類型的基本設計時支援已經内置于 .NET Framework 中;元件開發人員無須進行額外的工作就可利用基本設計時功能。

  有關設計時支援的更多資訊,請參見元件的設計時特性和增強設計時支援。

  承載元件

  元件可以被放置(承載)在一個容器(本主題稍後部分進行了定義)中。當元件被放置後,它通過其站點(本主題稍後部分進行了定義)與容器進行互動并能夠通過站點從其容器查詢并得到服務。為了確定容器拆卸後資源被釋放,容器必須實作 IDisposable 接口。在其 Dispose 方法的實作中,容器必須釋放它保留的所有資源,并調用它包含的每個元件的 Dispose 方法。

  包容是邏輯上的,不需要可視的表示形式。放置資料庫元件的中間層容器就是非可視包容的一個示例。可在 Visual Studio .NET 的 Windows 窗體設計器和 Web 窗體設計器中找到可視包容。可視化設計圖面是承載窗體元件(Web 窗體中的頁元件)的容器。

  封送元件

  元件可以是可遠端控制的或不可遠端控制的。可遠端控制的元件由引用或值進行封送。封送涉及跨邊界(如應用程式域(輕量程序)、程序、甚至是計算機)發送對象。當對象由引用封送時,會建立一個代理對該對象進行遠端調用。當對象由值進行封送時,跨相關邊界發送該對象的一個序列化的副本。

  以下可遠端控制的元件應該由引用封送:封裝系統資源的可遠端控制元件,較大的可遠端控制元件或作為單個執行個體存在的可遠端控制元件。由引用封送的元件的基類是 System.ComponentModel.Component。該基類實作 IComponent 并從 MarshalByRefObject 派生。.NET Framework 類庫中的許多元件從 Component 派生,包括 System.Windows.Forms.Control(Windows 窗體控件的基類)、System.Web.Services.WebService(使用 ASP.NET 建立的 XML Web services 的基類)和 System.Timers.Timer(生成周期性事件的類)。

  僅保留狀态的可遠端控制元件應該由值封送。由值封送的元件的基類是 System.ComponentModel.MarshalByValueComponent。該基類實作 IComponent 并從 Object 派生。.NET Framework 類庫中隻有極少元件是從 MarshalByValueComponent 派生的。所有這些元件都在 System.Data 命名空間中(DataColumn、DataSet、DataTable、DataView 和 DataViewManager)。

  注意 通過值封送的對象和通過引用封送的對象的基類分别是 Object 和 MarshalByRefObject,但相應的派生類的名稱則為 MarshalByValueComponent 和 Component。命名方案背後的邏輯是越常用的類型,其名稱就越簡單。

  如果不對元件進行遠端控制,則不要從 Component 的基實作派生,而應直接實作 IComponent。

  有關對象遠端控制的更多資訊,請參見.NET 遠端處理概述。

  控件

  控件是提供(或實作)使用者界面 (UI) 功能的元件。.NET Framework 為控件提供兩個基類:一個用于用戶端 Windows 窗體控件,另一個用于 ASP.NET 伺服器控件。它們是 System.Windows.Forms.Control 和 System.Web.UI.Control。.NET Framework 類庫中的所有控件都是直接或間接從這兩個類派生的。System.Windows.Forms.Control 從 Component 派生,它本身提供 UI 功能。System.Web.UI.Control 實作 IComponent,它還提供結構,在這個結構上可以很友善地添加 UI 功能。

  注意 每個控件都是一個元件,但并不是每個元件都是控件。

  容器和站點

  如果您正在為 Windows 窗體或 Web 窗體頁(ASP.NET 頁)開發元件和控件,則不需要實作容器或站點。Windows 窗體和 Web 窗體的設計器就是 Windows 窗體和 ASP.NET 伺服器控件的容器。容器向放置在其中的元件和控件提供服務。在設計時,控件放置在設計器中并從設計器獲得服務。為了保持完整性,以下給出了容器和站點的定義。

  容器

  容器是一個實作 System.ComponentModel.IContainer 接口的類,或從實作該接口的類派生的類。容器在邏輯上包含一個或多個元件,這些元件叫做容器的子元件。

  站點

  站點是一個實作 System.ComponentModel.ISite 接口的類,或從實作該接口的類派生的類。站點由容器提供,用來管理其子元件及與子元件進行通信。通常,容器和站點作為一個單元來實作。