ShowDialog返回后是否可访问窗体及其中成员?
ShowDialog返回后是否可访问窗体及其中成员?
嘿,我来给你掰扯清楚这个问题!看你用了工厂方法+using的方式处理模态窗体,刚好踩中了「窗体生命周期」的关键点,咱们一步步说:
在
using代码块内:完全可以正常访问
当ShowDialog()返回后,只要还没跳出using的大括号,你的窗体实例f还没被自动调用Dispose()方法回收资源。这时候不管是窗体自身的成员(比如你写的Foo()方法、Bar属性),还是里面的Label这类控件,都能正常读取访问。而且因为你的静态方法ShowMyForm和这些私有成员同属MyForm类,哪怕Foo和Bar是private修饰的,也能直接调用,完全合法。比如你可以把代码补成这样:public static bool ShowMyForm(out string s, out int i) { using (MyForm f = new MyForm()) { bool ok = f.ShowDialog() == DialogResult.OK; // 这里调用私有方法、读取私有成员都没问题 s = f.Foo(); i = f.Bar; return ok; } }跳出
using代码块:绝对不能再访问
一旦离开using块,.NET会自动执行f.Dispose(),把窗体和内部控件的所有资源都释放掉。这时候如果还持有f的引用并试图访问它的成员或控件,十有八九会触发ObjectDisposedException——毕竟对象已经被「销毁回收」了,自然不能再用。
要是你的需求就是关闭模态窗体后提取上面的用户输入或控件数据,直接把所有读取逻辑放在using块内部完成就好,既安全又符合.NET的资源管理规范。
内容来源于stack exchange
相关产品推荐
相关产品推荐

