我已经实施了WPF UserControl
。
该实现包括析构函数。
如果我将此控件作为窗口的一部分,然后销毁此窗口,然后强制进行垃圾收集(GC.Collect()),则会调用析构函数。
如果我将此控件添加到TabItem
,然后将其添加到TabControl
,稍后从TabItem
中删除此TabControl
,然后强制执行垃圾集合(GC.Collect()),不会调用析构函数。
澄清:
以下是添加标签项的代码:
TabItem tabItem = new TabItem();
tabItem.Header = "User";
UserControl1 userControl1 = new UserControl1();
tabItem.Content = userControl1;
userControl1.Width = Double.NaN;
userControl1.Height = Double.NaN;
userControl1.HorizontalAlignment = System.Windows.HorizontalAlignment.Stretch;
userControl1.VerticalAlignment = System.Windows.VerticalAlignment.Stretch;
tc1.Items.Add(tabItem);
以下是删除它的代码:
TabItem item = tc1.SelectedItem as TabItem;
if (item != null)
{
item.Content = null;
tc1.Items.Remove(item);
}
鉴于不再有对TabItem或UserControl1的引用,我希望为UserControl1调用析构函数。
显然不是这样,所以我的下一个问题是为什么?
答案 0 :(得分:1)
除非你的类拥有非托管资源,否则你不应该依赖或使用析构函数。
在您的示例中,某些内容(如事件订阅者)可能持有对TabItem的引用,从而阻止其进行垃圾回收。