本主题对组件和控件进行了定义;此处进行的讨论可以帮助您决定何时实现一个是组件或控件的类。
说明 |
---|
|
以下列表为实施者提供了全面的指南。
如果您的类使用外部资源但不用于设计图面,则实现 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。