C#由Form的Show和ShowDialog以及Close的问题引发的关于Form机制的思考(一)

本文探讨了C#中Form的ShowDialog、Show方法及Close方法的内部机制,尤其是窗体关闭后为何仍能访问其属性。通过反编译和MSDN文档,解释了IsHandleCreated属性在其中的作用,指出只有当IsHandleCreated为false时,调用Close方法才会使窗体立即释放。文章以一个实际问题为切入点,引导读者理解Form的资源管理,并预告了对Form机制的进一步探讨。
摘要由CSDN通过智能技术生成

大约一年前吧,在某个技术交流群里出现了这么一个问题,大致上问的是Form在ShowDialog并调用了Close方法并没有及时释放,紧跟其后的语句仍然能读到这个Form的相关属性,也就是说程序并没有立即释放它,测试代码形如:

            Form2 frm2 = new Form2();
            if (frm2.ShowDialog() == DialogResult.OK)
                MessageBox.Show("Yes");
            else
                MessageBox.Show("No");
            frm2.Close();
            string strTest = frm2.strTest;

其中frm2里调用按钮的事件处理中调用了this.Close和this.DialogResult=DialogResult.OK。

当时工作仅一年,.Net本质论也还看的懵懵懂懂的,对Form的机制并不理解,当时根据对GC的理解,猜测是上下文的引用关系导致了GC没有及时释放它,今天,刚刚在群里又有人问了相似的问题,闲暇之余(好吧,我承认是工作时间偷懒了~)用Relector看了Form的相关方法,尝试理解了下它的机制,发现并不是当初想的那么回事儿,整个Form的机制也不像我们从表面上看的那么简单,它事实上采用了一种消息的机制来实现的,因为工作时间的关系

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值