本主题对组件和控件进行了定义;此处进行的讨论可以帮助您决定何时实现一个是组件或控件的类。
说明 |
---|
|
以下列表为实施者提供了全面的指南。
如果您的类使用外部资源但不用于设计图面,则实现 IDisposable,或者从直接或间接实现 IDisposable 的类派生。
如果您的类要用于设计图面(如 Windows 窗体或 Web 窗体设计器)上,则实现 IComponent,或者从直接或间接实现 IComponent 的类派生。 请注意,IComponent 扩展 IDisposable,因此 IComponent 类型始终是 IDisposable 类型。 与不是 IComponent 的 IDisposable 类型相比,IComponent 类型的性能系统开销要小。但这一不足通常可由在设计时和运行时安置 IComponent 的能力来弥补。 (在本主题的后面部分将对该安置功能进行说明)。如果您需要一个可设计(可在设计图面上使用)并且可按引用封送的类,则可从 Component 派生。 Component 是按引用封送的 IComponent 类型的基实现。如果您需要一个可按值封送的可设计类,则可从 MarshalByValueComponent 派生。 MarshalByValueComponent 是按值封送的 IComponent 类型的基实现。如果希望向对象模型层次中引入 IComponent 类型,但由于单次继承的原因而不能从 Component 或 MarshalByValueComponent 之类的基派生,请实现 IComponent。
如果需要提供用户界面的可设计类,则该类是控件。 控件必须从以下基本控件类之一直接或间接派生:Control 或 Control。说明 如果您的类既不是可设计类,也不保存外部资源,则不需要 IComponent 或 IDisposable 类型。
下面是组件、控件、容器和站点的定义。
下面的示例显示了在基组件和在派生的组件中实现 Dispose 的方式。
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. }
说明 |
---|
|
如果不对组件进行远程控制,则不要从 Component 的基实现派生,而应直接实现 IComponent。