长期的joelonsoftware粉丝,第一次stackoverflow海报.
我想知道"我有多安全",我可以做以下(C#):
Form formDlg = new Form();
TextBox box = new TextBox();
formDlg.Controls.Add( box );
formDlg.ShowDialog();
formDlg.Dispose();
string sUserEntered = box.Text; // After parent Dispose'd!
Run Code Online (Sandbox Code Playgroud)
在实践中,这(显然)有效,因为box(作为Control)有一个私有文本字段(字符串),用于在销毁窗口句柄后实现其Text属性.
我不会满意一般回答"你在处理后无法访问对象"因为(1)我在MS文档中找不到任何这样的全面禁止,(2)我没有访问不受管理的对象资源,以及(3)此代码不会抛出任何异常(包括ObjectDisposedException).
我想这样做,所以我可以创建并使用一个组合的"ShowAndDispose"方法来减少忘记总是在ShowDialog()之后调用Dispose()的风险.
更复杂的是,调试器中的行为发生了变化.如果我在Dispose()之前休息; 然后快速观察框并深入到其Control基类; 然后走过Dispose(); 然后box.Text返回""!在其他方案中,box.Text返回用户输入的文本.
这段代码运行没有问题是一个实现细节。Control.Text 属性恰好由 Control 类缓存,因此处置 TextBox 不会导致 ObjectDispose 异常。
顺便说一句,这种情况相当罕见,许多控件属性 getter 和 setter 都会生成一条 Windows 消息,向本机 Window 控件询问属性值。你会因为 Handle 属性不再有效而大吃一惊。还值得注意的是,Text 属性设置器会更新缓存的值,但也会生成一条 Window 消息来更新本机控件。这里轰隆隆。
我认为这只是一般兴趣,不要在程序中使用这样的代码。好吧,你很快就会发现。
| 归档时间: |
|
| 查看次数: |
830 次 |
| 最近记录: |