0

我已经实现了 WPF UserControl。此实现包括析构函数。

如果我将此控件作为窗口的一部分,然后销毁此窗口,然后强制垃圾回收(GC.Collect()),则调用析构函数。

如果我将此控件添加到 a 中,TabItem然后将其添加到 a中,然后从 中TabControl删除它,然后强制垃圾回收(GC.Collect()),则不会调用析构函数。TabItemTabControl

澄清:

这是添加选项卡项的代码:

            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 调用析构函数。

这显然不是这样,所以我的下一个问题是为什么?

4

1 回答 1

1

除非您的类拥有非托管资源,否则不应依赖或使用析构函数。

在您的示例中,诸如事件订阅者之类的东西可能持有对 TabItem 的引用,从而阻止它进行垃圾收集。

于 2013-03-19T18:07:18.903 回答