0

私は WPF を実装しましたUserControl。この実装にはデストラクタが含まれています。

このコントロールをウィンドウの一部にして、このウィンドウを破棄し、ガベージ コレクション (GC.Collect()) を強制すると、デストラクタが呼び出されます。

このコントロールを に追加しTabItem、これを に追加し、後でこれを から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 に答える