【问题标题】:Is a form Disposed when the user closes it from window bar/etc当用户从窗口栏/等关闭表单时,是否会释放表单
【发布时间】:2010-01-11 21:50:13
【问题描述】:

当用户使用右上角的 X 或 Alt+F4 关闭 System.Windows.Forms.Form 时,它会自动释放吗?表单用form.Show(this)显示,而不是form.ShowDialog(...);

【问题讨论】:

    标签: c# .net winforms


    【解决方案1】:

    对于Show,是的(在WmClose 的末尾)。对于ShowDialog,不,不是。有趣;-p

    对于 ShowDialog,see MSDN:

    由于显示为对话框的表单没有关闭,因此当您的应用程序不再需要该表单时,您必须调用该表单的 Dispose 方法。

    为了证明这一点:

    Form main = new Form();
    Form test = new Form();
    test.Text = "Close me";
    test.Disposed += delegate {
        main.Text = "Second form was disposed";
    };
    main.Shown += delegate {
        test.Show();
    };
    Application.Run(main);
    

    【讨论】:

    • 哇,我不知道这个。他们会因此而导致内存泄漏吗?
    • 从不处理ShowDialog 显示的表单?好吧,可能不是泄漏,但清理底层窗口句柄可能需要更长的时间(GC)。
    • 我发现泄漏只是因为没有处理 ShowDialog'ed 表单。 .Dispose 没有被调用,这意味着表单上的控件从未被释放,这意味着其中一个控件没有从 SystemEvents 处理程序中注销自身。所以控件永远不会被释放,因为它订阅了一个事件(并且该事件存在于应用程序的范围内),控件再次引用了它的表单,防止整个表单及其上的所有内容永远不会被 GC'ed
    猜你喜欢
    • 1970-01-01
    • 2011-09-14
    • 2017-08-16
    • 1970-01-01
    • 2012-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多