gpt4 book ai didi

c# - 在父表单 Dispose() 之后访问控件的 Text 属性?

转载 作者:太空狗 更新时间:2023-10-29 23:19:14 24 4
gpt4 key购买 nike

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!

实际上,这(显然)有效,因为 box(作为 Control)有一个私有(private)的 text 字段(一个字符串),它它用于在其窗口句柄被销毁后实现其 Text 属性。

我不会对“对象被处置后无法访问”这样的笼统回答感到满意,因为 (1) 我在 MS 文档中找不到任何此类全面禁止,(2) 我不是访问非托管资源,以及 (3) 此代码不会引发任何异常(包括 ObjectDisposedException)。

我想这样做,这样我就可以创建并使用组合的“ShowAndDispose”方法来降低忘记始终在 ShowDialog() 之后调用 Dispose() 的风险。

更复杂的是,调试器中的行为发生了变化。如果我在 Dispose() 之前中断;然后是 Quick Watch box 并深入到其 Control 基类;然后越过 Dispose();然后 box.Text 返回“”!其他场景下box.Text返回用户输入的文本。

最佳答案

这段代码运行没有问题是一个实现细节。 Control.Text 属性恰好由 Control 类缓存,因此处理 TextBox 不会导致 ObjectDisposed 异常。

顺便说一句,这是相当罕见的,许多控件属性 getter 和 setter 生成 Windows 消息以向 native Window 控件询问属性值。你会因为 Handle 属性不再有效而对它们大发雷霆。还值得注意的是,Text 属性 setter 会更新缓存的值,还会生成一个 Window 消息来更新 native 控件。这里是 Kaboom。

我认为这只是一般的兴趣,永远不要在您的程序中使用这样的代码。好吧,你会很快发现的。

关于c# - 在父表单 Dispose() 之后访问控件的 Text 属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2393188/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com