较旧的应用程序使用隐式实例加载某些表单:
find $PWD -type f -name $filename 2>/dev/null | wc -l
在VS2008 32位和VS2013 64位之间的某个时间,表单在重新加载时停止初始化。例如,如果您加载表单,关闭表单(使用Close方法),然后再次加载表单,类和控件(以及我假设,表单)不会初始化为新实例。
重新初始化可以通过将form2.showdialog()
放在FormClosed事件中,或者使用表单的显式实例来完成:
me.dispose()
是否有充分的理由使用这些方法之一,或者是否有另一种方法应该用于在重新加载时初始化表单?
答案 0 :(得分:2)
如果使用Show方法显示表单,将自动调用Dispose。如果使用ShowDialog等其他方法(您的情况是这样),或者表单根本不显示,则必须在应用程序中调用Dispose。您还可以通过将dispose从设计器文件移动到代码文件中来处理dispose,并处理它们。
另一方面,Using
语句通常使您的应用程序更易于维护,并且不易出现与资源生命周期相关的死锁和其他不当行为。我会坚持使用这种方法。
此外,您无法将Me.Dispose
放入Form Closed
事件(可能的问题)。如果您使用ShowDialog
它将会失败,因为它会首先处理您的对象,如果您需要它们,它们就会消失。
以下是有关处置的更多内容:https://msdn.microsoft.com/en-us/library/aw58wzka(v=vs.110).aspx
答案 1 :(得分:1)
非常明确的解释from MSDN
与非模态表单不同,.NET不会调用Close方法 用户单击对话框的关闭表单按钮时的框架 或设置DialogResult属性的值。相反,形式是 隐藏,可以再次显示而无需创建新的实例 对话框。因为隐藏了显示为对话框的表单 关闭,你必须在表单时调用表单的Dispose方法 您的应用程序不再需要。
当ShowDialog()
被调用并关闭时,表单的实例将保留在内存中,并且可以再次使用,例如从某些公共属性获取结果。
如果您不再使用此表单,则需要调用Dispose
方法来处理表单和表单的控件
Dim myform As New MyDialogForm()
myform.ShowDialog()
Dim result As Object = myForm.SelectedResult()
myform.Dispose() 'need to call manually, if instance not used anymore
当您使用Using
关键字时,Dispose
块的结尾会自动执行Using
方法
Dim result As Object
Using myform As New MyDialogForm()
myform.ShowDialog()
result = myForm.SelectedResult()
End Using 'myform.Dispose will be called
底线:两种方法做同样的事情。
但是Using
阻止会自动调用Dispose
方法
P.S。将Me.Dispose
放入FormClosed
事件处理程序然后再
- 形式的实例将留在记忆中,即使形式被关闭
- 并且只有在您再次尝试使用已处理的控件之后才能使用。如果您尝试显示处置对象,则会抛出ObjectDisposedException
。
如果您不再使用表单,则Using
阻止将是最佳方法
答案 2 :(得分:1)
使用ShowDialog()显示表单时,Form对象及其子控件不会自动处理。这听起来很古怪,但这是为了非常的理由。 ShowDialog返回DialogResult.OK
后,您通常会获得对话框结果。没人会喜欢因为ObjectDisposedException而失败。由于对话结果通常存储在控件中,因此可能会发生这种情况。
您应始终使用Using
语句来确保处理表单对象及其所有控件。
可能的角落情况是故意不处理它,因为您喜欢重新显示具有原始输入值的对话框。但这并非完全错误,但它仍然是保存这些值的非常昂贵的方法。那些未曝光的窗口对象在系统资源中花费了一条腿和一条腿。