组件与控件
时间:2008-07-16 来源:*^cherish^*
组件可以和控件一道陈列于工具箱之中,并可被拖放到任何设计表面之上。组建可以在设计器中进行属性设置或事件处理,就如同控件一样。
this.components = new System.ComponentModel.Container();
this.timer1 = new System.Windows.Forms.Timer(this.components);
当一个组件被创建的时候,他和窗体上的其他组件一样被放入一个组件列表,此组件列表类似于窗体用于跟踪其他控件的Controls集合。this.components = new System.ComponentModel.Container();
组件是指实现了System。ComponentModel命名空间中的ICompoent接口的任何类
interface IComponet:IDisposable
{
ISite Site{get;set;}
event EventHandler Disposed;
}
interface IDisposable{
void Dispose();
}
控件不需要这些额外的代码,因为他们已经有了一个CLosed事件,对于大多数用途而言这相当于一个等价的通知。为了让设计器知道,一个组件希望当容器被释放时得到通知,此组件可以实现一个“IContainer类型的参数”的公共构造函数:
public MyConponent(IContainer container)
{
container。add(this);
InitializeComponent();
}
设计器生成代码来使用这个构造函数,通过将一个容器传递给它,从而将组件添加进容器之中。
默认的情况下,大多数vs。net生成的包含组件的类,都会在Dispose方法实现中通知容器中的每个组件:
public class MyForm:Form{
IContainer component;
//重写基类Component。Dispose方法
protected override void Dispose(bool disposing)
{
if(disposing)
{
if(component!=null)
component.Dispose();
}
}
base.Dispose(disposing);
}
public class MyCon:Component
{
Timer timer;
IContainer component;
void InitializeComponent(){
this.components=new Container();
this.timer1=new Timer(this.component);
}
protected override void Dispose(bool disposing)
{
if(disposing){
//释放托管资源
。。。。
if(components!=null)
{
components.Dispose();
}
}
//释放非托管资源
。。。。
}
}
参数为true,意味着Dispose被一个“记得正确地释放组件”的客户程序所调用。
false意味着客户程序忽略对象的释放,.net垃圾回收器(GC)将调用我们对象的终结器(finalizer)。GC将在一个不确定的时间调用终结器,虽然终结器不是一个回收资源的好地方,反它总比根本不回收资源好得多。
基类Component的终结器实现调用Dispose方法,传第一个false值,表明组件不应该去碰它所容纳的任何托管对象。
任何包含其他“实现IDispose接口或者处理非托管资源”的对象的组件,都应该实现Dispose方法,以便当组件自身被容器释放时正确地释放所包含的对象的资源。
相关阅读 更多 +