Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用Dispose()从窗体中删除控件_C#_Garbage Collection_Dispose - Fatal编程技术网

C# 使用Dispose()从窗体中删除控件

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()从窗体中删除控件是否正确

例如,我的公式上有一个按钮“button1”。调用Dispose()时,它会立即从表单以及表单的“控件”集合中消失。但情况总是这样吗?或者是否存在GC等待一段时间的其他情况(可能是其他控制?

来自:

此方法由public Dispose方法和Finalize调用 方法。Dispose使用调用受保护的Dispose(布尔)方法 将参数设置为true。Finalize调用Dispose with 设置为false

所以我认为没问题。

这个
控制.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;