首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

.net中Form的生命周期?解决办法

2012-01-23 
.net中Form的生命周期?在下面的代码中,privatevoidbutton1_Click(objectsender,EventArgse){MyFormmyForm

.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
{


this.ResetSecurityTip(true);
}
if (!this.IsMdiChild)
{
base.SetVisibleCore(value);
if (this.formState[FormStateSWCalled] == 0)
{
UnsafeNativeMethods.SendMessage(new HandleRef(this, base.Handle), 0x18, value ? 1 : 0, 0);
}
}
else
{
if (base.IsHandleCreated)
{
this.DestroyHandle();
}
if (!value)
{
this.InvalidateMergedMenu();
base.SetState(2, false);
}
else
{
base.SetState(2, true);
this.MdiParentInternal.MdiClient.PerformLayout();
if ((this.ParentInternal != null) && this.ParentInternal.Visible)
{
base.SuspendLayout();
try
{
SafeNativeMethods.ShowWindow(new HandleRef(this, base.Handle), 5);
base.CreateControl();
if (this.WindowState == FormWindowState.Maximized)
{
this.MdiParentInternal.UpdateWindowIcon(true);
}
}
finally
{
base.ResumeLayout();
}
}
}
this.OnVisibleChanged(EventArgs.Empty);
}
if ((value && !this.IsMdiChild) && ((this.WindowState == FormWindowState.Maximized) || this.TopMost))
{
if (base.ActiveControl == null)
{
base.SelectNextControlInternal(null, true, true, true, false);
}
base.FocusActiveControlInternal();
}
}
}
}
[解决办法]
为了清晰,我们摘出关键代码重新审定逻辑.

if ( this.dialogResult != DialogResult.OK )
{
if ( !value || this.CalledMakeVisible )
{
base.SetVisibleCore(value);
}
else if ( this.GetVisibleCore() != value )
{
if (value)
{
this.CalledMakeVisible = true;
if (this.CalledCreateControl && this.CalledOnLoad)
{
if (!Application.OpenFormsInternal.Contains(this))
{
Application.OpenFormsInternalAdd(this);//关键在这里,真相大白
}
}
}
}
}
[解决办法]
目前在win32没有退出舞台之前,最好学习一下c 的win32编程,你就会清楚一个windows窗体的生死,这里所谓from只不过是一层包装。具体这个包装如何做,详细地可能需要微软才能回答。

[解决办法]
觉得这个和是不是C++无关.

在MFC中显示一个窗口的时候不也是这样的吗.

热点排行