日期:2014-05-19  浏览次数:20933 次

.net中Form的生命周期?
在下面的代码中,    
 
                              private     void     button1_Click(object     sender,     EventArgs     e)    
                              {    
                                              MyForm     myForm     =     new     MyForm();    
                                              myForm.Show();    
                              }    
                 
              一般来说,myForm这个对象在button1_Click方法结束后,生命周期便结束,将会被GC清除。但是实际上myForm对应的窗口如果不按右上角“关闭按钮”是不会被GC清除的。为什么GC会对myForm“另眼相看”呢?    
 
              对C#和GC理解有限,请各位大侠出手释惑!

------解决方案--------------------
不太同意楼上关于类似c++的指针的比方
winform 背后应该关联于真实的windows窗口,可以从from.Handler属性看出
他不能被垃圾回收类似于sqlconnection 它关联于一个非托管的资源。或者说它不是纯粹的.net类。
------解决方案--------------------
myForm.Show(); //关键应该是这句吧
虽然不太了解,但如果不show 退出方法后是会被回收的
show出之后是不是就进入了 另外一个相对的进程啊?这个进程消亡之前是不会被回收的(界面?)
------解决方案--------------------
Show的时候,对象实体又没消亡, 点关闭的时候执行了 dispose方法的呀
------解决方案--------------------
Reflector很快就找到了:

当对Form调用Show方法时,会设置其Visible属性为true,而在Visible属性的set方法中,调用SetVisibleCore方法,这个方法被Form重写,代码如下:

[EditorBrowsable(EditorBrowsableState.Advanced)]
protected override void SetVisibleCore(bool value)
{
if ((this.GetVisibleCore() != value) || (this.dialogResult != DialogResult.OK))
{//这里应该是判断Visible是否发生改变或者dialogResult是不是OK
if ((this.GetVisibleCore() == value) && (!value || this.CalledMakeVisible))
{//这里进一步的确认Visible没有发生改变(注意上面的if,其实这个分支的第一个判断就是判断dialogResult是不是OK,如果dislogResault不是OK,那么这里的this.GetVisibleCore() == value与上面的条件互斥),并且visible被设为false或者自己的CalledMakeVisible属性为true。
base.SetVisibleCore(value);
}
else
{//换言之,这里是this.GetVisibleCore()发生了改变的分支
if (value)//如果Visible被设置为true
{
this.CalledMakeVisible = true;
if (this.CalledCreateControl)
{
if (this.CalledOnLoad)
{
if (!Application.OpenFormsInternal.Contains(this))
{
Application.OpenFormsInternalAdd(this);//关键在这里,真相大白
}
}
else
{
this.CalledOnLoad = true;
this.OnLoad(EventArgs.Empty);
if (this.dialogResult != DialogResult.None)
{
value = false;
}
}
}
}
else
{