類、組件和控制項

來源:互聯網
上載者:User
文章目錄
  • 控制外部資源
  • 設計時支援
  • 承載組件
  • 封送組件

轉自: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 伺服器控制項
擴充設計時支援

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.