我是否需要处理静态对象中定义的非静态对象?

时间:2016-12-11 20:23:26

标签: c# memory-management

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

public static FormMain formMain;

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

正如您所看到的,我在调用它之前为此静态表单分配了一个内存空间(使用new)并在表单关闭后释放了内存(使用Dispose

但是,在这种静态形式中,我已经定义了几个非静态对象(比如标签),如下所示:

public FormMain()
{
    // some code here
    Label myLabel1 = new Label();
    Label myLabel2 = new Label();
    Label myLabel3 = new Label();
    // some code here
}

现在,我有两个问题:

  1. 我是否还必须Dispose这些非静态对象,或者在调用formMain.Dispose();行后是否释放它们(释放内存)?

  2. 如果我需要处理这些非静态对象,我应该在程序的哪个阶段使用Dispose(例如,在FormClosed或{{1}中} event)?

  3. 注意:我尽量不在Visual Studio中使用表单设计工具,但更喜欢逐行编写表单。

1 个答案:

答案 0 :(得分:3)

  

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

不确定为什么要将应用程序主窗口窗体存储为公共静态字段。您在考虑什么特殊情况?

  

如您所见,我在调用之前为此静态表单分配了一个内存空间(使用new)...

这不是C ++。在C#中调用new是强制性的,当涉及引用类型时,它不是一个选项。

  

并在表单关闭后释放内存(使用Dispose)。

调用Dispose根本不释放任何托管内存。我建议你阅读IDisposable模式和托管内存模型,你似乎在这里误解了很多。

  

我必须同时处理这些非静态对象,或者只要formMain.Dispose();它们是否被释放(释放内存);行被调用?

静态或非静态无关,您应该丢弃所有一次性物品。阅读this了解更多信息

  

如果我需要处理这些非静态对象,我应该在程序的哪个阶段使用Dispose(比如,在FormClosed或FormClosing事件中)?

您应该遵循IDisposable模式的指导原则。