當前位置:編程學習大全網 - 編程語言 - NET類,組件,控件以及組件和控件的區別

NET類,組件,控件以及組件和控件的區別

組件和控件的區別:

1、Component在Run Time時不能呈現UI,而Control可以在Run Time時呈現UI(但是vs 2005裏的asp.net中的SqlDataSource是Control,但是它不能呈現UI)。

2、Component是貼在容器Container上的,而Control則是貼在Windows Form或者Web Form上的。

舉例來說,SqlCommand是個Component,DataGrid則是壹個Control。

類:

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

如果您的類要用於設計圖面(如 Windows 窗體或 Web 窗體設計器),則實現 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.

}

設計時支持

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

有關設計時支持的更多信息,請參見組件的設計時屬性 (Attribute) 和擴展設計時支持。

承載組件

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

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

封送組件

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

以下可遠程控制的組件應該由引用封送:封裝系統資源的可遠程控制組件,較大的可遠程控制組件或作為單個實例存在的可遠程控制組件。由引用封送的組件的基類是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 功能的基礎結構。

註意

每個控件都是壹個組件,但並不是每個組件都是控件。

在.net環境下編寫Windows Form 控件非常的簡單,只要直接和間接繼承與System.Windows.Forms.Control即可,Control類為我們提供了很多高級的特性,如:窗口句柄、管理消息、鼠標和鍵盤事件、可視化屬性(Color、Size、Position)、安全和線程支持等等,有了這些高級的特性,我們編寫Windows Form 控件就簡單的多,同時我們也可以把更多的精力放在我們應該關註的地方,如UI如何畫、數據的Binding和顯示

在.net下編寫Windows Form 控件有三種方式,從System.Windows.Forms.Control派生的自定義控件、從已有的控件派生(如System.Windows.Forms.TextBox)的擴展控件、從System.Windows.Forms.UserControl派生的組合控件,很多的朋友都分不清楚UserControl和Control之間的區別,不知道到底從哪個類進行派生,簡單的說:UserControl比Control更高級,提供了更多的高級特性,Control 類只提供控件所需的所有基本功能(包括鼠標和鍵盤處理事件),但不提供可視化的UI,所以說從Control派生的話,用戶必須override OnPaint,UserControl相比Control為我們提供了更多的特性,但是UserControl也就失去了更多的靈活性

組件和控件的設計時考慮:

Designer顧名思義就是為Component設計時服務的,Designer可以在設計時修改組件的行為,還可以提供它自己的服務和行為。

在.net裏要為Control或者Component定制Designer,只要從IDesigner繼承下來即可,但是在.net裏ms已經幫我們做了兩個從IDesigner繼承下來的基類,ComponentDesigner和ControlDesigner,ComponentDesigner是為Component而設計的,ControlDesigner是為Control而設計的,所以我們可以直接從ComponentDesigner繼承。

Designer可以提供右鍵快捷菜單上的菜單命令,我們可以通過實現ComponentDesigner 謂詞(Verbs) 屬性來定義 get 訪問器,該訪問器返回的 DesignerVerbCollection 中包含用於生成菜單命令的 DesignerVerb 對象。同時我們對組件被雙擊時定制默認操作,在Component Designer實現 DoDefaultAction 方法即可

組件的文檔設計器

每個Component不但是有Component Designer,而且還有Component DocumentDesigner,但這兩個Designer之間到底有什麽樣的區別呢?我用比較通俗的講法來給大家區別下,Component Designer是指壹個Component被拖放到Form或者Page的Container上時所呈現出來的UI設計器(圖1);Component DocumentDesigner則是指Component本身根文檔設計器(圖2)

12

容器和站點

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

Container

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

Site

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

  • 上一篇:求情書,好的加懸賞?
  • 下一篇:信息技術教師個人工作總結5篇
  • copyright 2024編程學習大全網