Clear不会释放控件,从而导致内存泄漏。从链接:
调用 Clear 方法不会从内存中删除控制句柄。您必须显式调用 Dispose 方法以避免内存泄漏。
由于在循环中处理会弄乱索引,因此您可以将控件集合复制到另一个列表并对其执行ForEach循环或使用向后For循环。
for (int i = myTableLayoutPanelControls.Count - 1; i >= 0; --i)
myTableLayoutPanelControls[i].Dispose();
调用Dispose将从内存中删除控件(当 GC 拾取它时)。这也将处理子控件Dispose方法的调用。
一个问题是,如果您有一个实现的自定义控件,IDisposable或者您在Dispose不调用该方法的情况下覆盖该base方法。在您的对象的Dispose方法中,您需要确保您已取消订阅您范围之外的任何事件。如果您不这样做,该引用将使您的对象保持活动状态。