2016-12-11 118 views
-2

就像在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(比如,在FormClosedFormClosing事件)?

注意:我尽量不使用表单设计工具在Visual Studio,但更喜欢通过代码行表格线。

+1

Application.Run已经在示例中处理了这个表单:“Form类的Dispose方法将在返回[Application.Run]方法之前被调用。” – user2864740

+0

我不是在询问窗体,而是在窗体中定义的非静态对象('myLabel1','myLabel2'等)。 – ssd

+1

'FormMain'应该处理它创建的成员变量。 “FormMain”是否存储在一个静态变量中无关紧要。 –

回答

3

就像在Visual Studio中的默认C#的模板,我已经定义了一个Windows窗体作为一个静态对象,如下图所示:

不知道为什么你要存储应用程序主窗口形式作为一个公共静态领域。你在想什么特别的场景?

正如你所看到的,我已经分配给这个静态形式的存储空间(使用新)调用之前...

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

并在窗体关闭后释放内存(使用Dispose)。

调用Dispose释放了没有管理的记忆力。我建议你阅读IDisposable模式和托管内存模型,你似乎在这里有一些误解。

是否必须处理这些非静态对象以及它们是否一旦formMain.Dispose()被释放(释放内存)行被调用?

静态或非静态是无关紧要的,你应该处置所有的一次性物品。阅读this更多信息

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

您应该遵循IDisposable模式的准则进行处置。

+0

关于有问题的程序;我有**(1)**一些在方法中定义的标签(如'FormMain()')和**(2)**在FormMain类的主体中定义的一些其他标签我在主体中定义它们,因为我使用它们与其他表单进行交互)。到目前为止,我推断,对于在方法中定义的标签(有一个范围),我不需要处理它们。另一方面,对于在表单主体中公开定义的标签,我需要在关闭表单之前处理它们(在FormClosing事件中)。我对吗? – ssd

+0

@ssd不,不,不。你应该根据'IDisposable'模式处理对象,忘记事件。此外,如果您希望它们具有任何用途,您在方法内创建的标签可能会被添加到窗体的“控件”集合中,因此即使本地名称超出范围,对象仍然可以访问。我的建议:忘记形式,控制和事件。你需要首先理解基础知识。阅读托管内存模型,了解它,然后在此基础上进行构建。在知道如何爬行之前,你似乎试图找出滑板。 – InBetween

相关问题