文章目錄
轉自:http://msdn.microsoft.com/zh-cn/library/0b1dk63b(VS.80).aspx
(英文)http://msdn.microsoft.com/en-us/library/0b1dk63b.aspx
類、組件和控制項
本主題對組件和控制項進行了定義;此處進行的討論可以協助您決定何時實現一個是組件或控制項的類。
以下列表為實施者提供了全面的指南。
-
如果您的類使用外部資源但不用於設計介面,則實現 System.IDisposable,或者從直接或間接實現 IDisposable 的類派生。
-
如果您的類要用於設計介面(如 Windows 表單或 Web Form設計器),則實現 System.ComponentModel.IComponent,或者從直接或間接實現 IComponent 的類派生。請注意,IComponent 擴充 IDisposable,因此 IComponent 類型始終是 IDisposable 類型。與不是 IComponent 的 IDisposable 類型相比,IComponent 類型的效能系統開銷要小。但這一不足通常可由在設計時和運行時安置 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 介面擴充 IDisposable 介面,後者在其協定中有一個名為 Dispose 的方法。在其 Dispose 方法實現中,組件必須顯式釋放外部資源。與記憶體回收過程中發生的預設、不確定的清理相比,這提供了一個確定的方法來釋放資源。開發人員必須在整個包容階層中傳播 Dispose以確保組件的子級同時釋放資源。另外,派生的組件必須調用其基類的 Dispose 方法。
| 注意 |
|
即使通過 Dispose 提供對資源的顯式控制,也應該始終通過終結器(解構函式)提供隱式清理,以防使用者未能對您的組件調用 Dispose 時資源永久泄漏。 |
下面的樣本顯示了在基組件和在派生的組件中實現 Dispose 的方式。
C# 複製代碼
public class BaseComponent : IComponent {
// IComponent extends IDisposable.
public void Dispose() {
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing) {
if (disposing) {
// Free other state (managed objects).
}
// Free your own state (unmanaged objects).
}
// Simply call Dispose(false).
~BaseComponent(){
Dispose (false);
}
}
// Derived component.
public class DerivedComponent : BaseComponent {
protected override void Dispose(bool disposing) {
if (disposing) {
// Free other state.
}
// You must invoke the Dispose method of the base class.
base.Dispose(disposing);
// Free your own state.
...
}
// No finalizer/destructor.
// No Dispose() method.
}
Visual Basic 複製代碼
' Design pattern for a base class.
Public Class BaseComponent
Implements IComponent
' Implement IDisposable
Public Overloads Sub Dispose()
Dispose(True)
GC.SuppressFinalize(Me)
End Sub
Protected Overloads Overridable Sub Dispose(disposing As Boolean)
If disposing Then
' Free other state (managed objects).
End If
' Free your own state (unmanaged objects).
' Set large fields to null.
End Sub
Protected Overrides Sub Finalize()
' Simply call Dispose(False).
Dispose (False)
End Sub
End Class
' Design pattern for a derived component.
Public Class DerivedComponent
Inherits BaseComponent
Protected Overloads Overrides Sub Dispose(disposing As Boolean)
If disposing Then
' Release managed resources.
End If
' Release unmanaged resources.
' Set large fields to null.
' Call Dispose on your base class.
Mybase.Dispose(disposing)
End Sub
' The derived class does not have a Finalize method
' or a Dispose method with parameters because it inherits
' them from the base class.
End Class
設計時支援
在 .NET Framework 中,組件的一個重要功能就是它們是可設計的,這意味著作為組件的類可用於快速應用程式開發 (RAD) 環境(如 Visual Studio)中。可將組件添加到 Visual Studio 的工具箱中,也可將組件拖放到某個表單上,還可以在設計介面上對組件進行操作。請注意,對 IComponent 類型的基本設計時支援已經內建於 .NET Framework 中;組件開發人員無須進行額外的工作就可利用基本設計時功能。
有關設計時支援的更多資訊,請參見組件的設計時屬性 (Attribute) 和擴充設計時支援。
承載組件
組件可以被放置(承載)在一個容器(本主題稍後部分進行了定義)中。當組件被放置後,它通過其網站(本主題稍後部分進行了定義)與容器進行互動並能夠通過網站從其容器查詢並得到服務。為了確保容器拆卸後資源被釋放,容器必須實現 IDisposable 介面。在其 Dispose 方法的實現中,容器必須釋放它保留的所有資源,並調用它包含的每個組件的 Dispose 方法。
包容是邏輯上的,不需要可視的表示形式。放置資料庫組件的中介層容器就是非可視包容的一個樣本。可在 Visual Studio 的 Windows 表單設計器和 Web Form設計器中找到可視包容。可視化設計介面是承載表單組件(Web Form中的頁組件)的容器。
封送組件
組件可以是可遠端控制的或不可遠端控制的。可遠端控制的組件由引用或值進行封送。封送涉及跨邊界(如應用程式定義域(輕量進程)、進程、甚至是電腦)發送對象。當對象由引用封送時,會建立一個代理對該對象進行遠程調用。當對象由值進行封送時,跨相關邊界發送該對象的一個序列化的副本。
以下可遠端控制的組件應該由引用封送:封裝系統資源的可遠端控制組件,較大的可遠端控制組件或作為單個執行個體存在的可遠端控制組件。由引用封送的組件的基類是 System.ComponentModel.Component。該基類實現 IComponent 並從 MarshalByRefObject 派生。.NET Framework 類庫中的許多組件從 Component 派生,包括 System.Windows.Forms.Control(Windows 表單控制項的基類)、System.Web.Services.WebService(使用 ASP.NET 建立的 XML Web 服務的基類)和 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 Form頁(ASP.NET 頁)開發組件和控制項,則不需要實現容器或網站。Windows 表單和 Web Form的設計器就是 Windows 表單和 ASP.NET 伺服器控制項的容器。容器向放置在其中的組件和控制項提供服務。在設計時,控制項放置在設計器中並從設計器獲得服務。為了保持完整性,以下給出了容器和網站的定 義。
-
Container
-
容器是一個實現 System.ComponentModel.IContainer 介面的類,或從實現該介面的類派生的類。容器在邏輯上包含一個或多個組件,這些組件叫做容器的子組件。
-
Site
-
網站是一個實現 System.ComponentModel.ISite 介面的類,或從實現該介面的類派生的類。網站由容器提供,用來管理其子組件及與子組件進行通訊。通常,容器和網站作為一個單元來實現。
請參見概念
屬性概述
組件的設計時屬性 (Attribute)
其他資源
使用 .NET Framework 開發自訂 Windows 表單控制項
開發自訂 ASP.NET 伺服器控制項
擴充設計時支援