我需要处理在静态对象内定义的非静态对象吗?

9 浏览
0 Comments

我需要处理在静态对象内定义的非静态对象吗?

与Visual Studio中的默认C#模板一样,我将一个Windows Form 定义为一个静态对象,如下所示:\n

public static FormMain formMain;
static void Main()
{
    formMain = new FormMain();
    Application.Run(formMain);
    formMain.Dispose();
}

\n如您所见,在调用这个静态表单之前,我为这个静态表单分配了一块内存空间(使用new),并在表单关闭后释放了内存(使用Dispose)。\n然而,在这个静态表单中,我定义了一些非静态对象(比如标签),如下所示:\n

public FormMain()
{
    // 在这里写一些代码
    Label myLabel1 = new Label();
    Label myLabel2 = new Label();
    Label myLabel3 = new Label();
    // 在这里写一些代码
}

\n现在,我有两个问题:\n

    \n

  1. 我是否也需要对这些非静态对象进行Dispose,或者它们在调用formMain.Dispose()时被自动释放(内存被释放)?
  2. \n

  3. 如果我需要释放这些非静态对象,程序的哪个阶段应该优先使用Dispose(比如在FormClosed事件还是在FormClosing事件中)?
  4. \n

\n注意:我尽量不使用Visual Studio中的表单设计工具,而是逐行编写表单代码。

0
0 Comments

问题的原因是因为提问者在使用静态对象中定义非静态对象时是否需要进行Dispose操作存在疑惑。解决方法是根据IDisposable模式来进行Dispose操作,而不是依赖于事件。此外,需要理解C#中的内存管理模型以及基本概念。

C#中定义Windows Form为静态对象的做法有点奇怪,你在考虑什么特定的场景呢?

如你所见,在调用之前,我为这个静态窗体分配了一个内存空间(使用new)...

这不是C++。在C#中,调用new是强制性的,对于引用类型来说,这不是一个选择。

而在关闭窗体之后,我通过调用Dispose来释放内存。

调用Dispose根本不会释放任何托管内存。我建议你阅读一下IDisposable模式和托管内存模型,你似乎对此有些误解。

无论是静态还是非静态,都应该对所有可释放对象进行Dispose。阅读这个链接获取更多信息。

如果我需要对这些非静态对象进行Dispose,那么在程序的哪个阶段应该在FormClosed还是FormClosing事件中使用Dispose呢?

你应该遵循IDisposable模式的指南进行Dispose。

关于问题中的程序:我有一些在方法中定义的标签(如FormMain()),还有一些在FormMain类的主体中定义的其他标签(我在主体中定义它们为public,因为我用它们与其他窗体进行交互)。到目前为止,我得出的结论是,对于在方法中定义的标签(具有作用域),我不需要对它们进行Dispose。另一方面,对于在窗体的主体中公开定义的标签,我需要在关闭窗体之前(在FormClosing事件中)进行Dispose。我是对的吗?

不,不对。你应该根据IDisposable模式来进行Dispose操作,不要考虑事件。此外,你在方法中创建的标签,如果你希望它们有任何用途,可能被添加到窗体的Controls集合中,因此即使局部名称超出了作用域,对象仍然可以访问。我的建议是:不要考虑窗体、控件和事件。你需要先理解基础知识。先阅读一下托管内存模型,理解它,然后再建立在此基础上。你似乎想在连爬都不会的情况下试图滑冰。

0