1

シナリオは次のとおりです。私は実際にリソースを処分するのは(非常に)初めてなので、私の例でうまくいくかどうかは完全にはわかりません。ここでは、デモンストレーションのために非常に単純化された基本的なシナリオを示します。

を含むユーザー コントロールMyUserControlがありますscrollViewer。また、 aと aMyClassを含むクラスがあり、UI には a があり、ある時点で次のようにすべてが接続されます。gridtabItemtabControlMainWindow

List<MyClass> list = new List<MyClass>();

private void SomeMethod(TabItem tabItem)
    {
        MyUserControl uc = new MyUserControl();

        MyClass mc = new MyClass();
        list.Add(mc);
        mc.tabItem = tabItem;
        tabItem.Content = uc;

        uc.scrollViewer.Content = mc.grid; 

        tabControl.Items.Add(tabItem);
        tabControl.SelectedItem = tabItem;
    }

ある時点で、もう一度 tabItem を削除したいので、のリソースを解放したいのですが、uc必ずしもmcから削除するとは限りませんlist。から削除tabItemtabControlて設定するだけで十分mc.tabItem = nullですか?

4

1 に答える 1

2

それとは別に、ここで構築しているものは、あなたの質問に答えるだけで、実際に行くべき道ではありません:

「list」に「mc」が含まれ、「mc」が「tabItem」への参照を保持し、「tabItem」が「uc」への参照を保持している限り、「uc」はガベージ コレクションされません。「tabItem」がまだ「tabControl」にあるかどうかは問題ではありません。

mc.tabItem を null に設定すると、uc への参照がなくなり、uc がガベージ コレクションされます。したがって、あなたはあなたの質問に「はい」と答えます。tabItem.Contentそして、アカデミックにするためには、nullに設定するだけで十分です。

于 2013-09-19T21:38:36.530 に答える