C# 使用Dispose()从窗体中删除控件
使用Dispose()从窗体中删除控件是否正确 例如,我的公式上有一个按钮“button1”。调用Dispose()时,它会立即从表单以及表单的“控件”集合中消失。但情况总是这样吗?或者是否存在GC等待一段时间的其他情况(可能是其他控制?来自: 此方法由public Dispose方法和Finalize调用 方法。Dispose使用调用受保护的Dispose(布尔)方法 将参数设置为true。Finalize调用Dispose with 设置为false 所以我认为没问题。这个C# 使用Dispose()从窗体中删除控件,c#,garbage-collection,dispose,C#,Garbage Collection,Dispose,使用Dispose()从窗体中删除控件是否正确 例如,我的公式上有一个按钮“button1”。调用Dispose()时,它会立即从表单以及表单的“控件”集合中消失。但情况总是这样吗?或者是否存在GC等待一段时间的其他情况(可能是其他控制?来自: 此方法由public Dispose方法和Finalize调用 方法。Dispose使用调用受保护的Dispose(布尔)方法 将参数设置为true。Finalize调用Dispose with 设置为false 所以我认为没问题。这个控制.Dispos
控制.Dispose的“好处”没有文档记录
作为一般提示,您不应该围绕以下期望构建程序:未记录的行为在未来保持不变,或者甚至在所有当前控件实现中保持不变
但是,正如您可以从中看到的:
在当前的实现中确实发生了这种情况
但同样,这不是记录在案的行为。随心所欲。是否应该调用Dispose()?
无论何时看到任何实现System.IDisposable的类,都应该假定该类的设计者认为该类可能拥有一些稀缺资源
您没有义务调用这些类的对象的Dispose()。如果您不这样做,则终结器将。但是,如果不调用Dispose(),稀缺资源的占用时间将超过需要的时间,这可能导致资源不足
因此,实际上,在为控件指定null之前,应该调用Control.Dispose()
在处理控件之前,是否应从控件集合中删除该控件?
显然,当前实现确保从control.Parent.controls中的控件集合中删除已处置的控件
但是,根据您的实现,您是否确定添加控件的ControlCollection不是System.Windows.Forms.control.ControlCollection的子类,行为稍有不同?毕竟:ControlCollection不是密封的。即使您使用自己的ControlCollection创建了自己的表单,人们也可能使用自己的ControlCollection从您的表单派生
因此,为了确保您遵循处理ControlCollection的规则,我认为您应该在处理它之前从集合中删除该控件
// Create myControl and add to myForm
var myControl = new MyControl(...);
myControl.SetProperties
myForm.Controls.Add(myControl);
// proper removal:
// if someone else could already have removed the control:
// add a check if it is still there.
myForm.Control.Remove(myControl);
myControl.Dispose(); // no problem if already disposed
myControl = null;
我更喜欢隐藏而不是处置。因此我将使用“Controls.Remove(button1)”,而将其余的留给GC。我只是想知道为什么Dispose()适合我。谢谢大家!@user1027167-删除控件是不够的,您仍然应该调用控件。Dispose
@Joe:我想GC会调用应该调用Dispose的终结器。如果调用Dispose(),我必须确保没有其他人引用该控件。这是GC的工作。还是我错了?你不应该让一次性物品到处乱放,直到定型师把它们捡起来。您应该始终处理它们。@Henkholtman我完全同意,因为这种行为是在控件中实现的。dispose
,在任何情况下都应该调用它,所以它将被删除。但同样,这是未记录的行为。
// Create myControl and add to myForm
var myControl = new MyControl(...);
myControl.SetProperties
myForm.Controls.Add(myControl);
// proper removal:
// if someone else could already have removed the control:
// add a check if it is still there.
myForm.Control.Remove(myControl);
myControl.Dispose(); // no problem if already disposed
myControl = null;