2013-03-19 28 views
0

我已實施WPF UserControl。 該實現包含析構函數。如果我使這個控件成爲一個窗口的一部分,然後銷燬這個窗口,然後強制垃圾回收(GC.Collect()),則會調用析構函數。用戶控件在從選項卡控件中移除時未定型

如果我這個控件添加到TabItem,後者又加入TabControl,後來刪除此TabItemTabControl,然後強制垃圾收集(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

可能重複[TabControl.Items.Remove(TabItem)不釋放TabItem使用的內存](http://stackoverflow.com/questions/3167943/tabcontrol-items-removetabitem-does-not-free-memory-用於tabitem) – 2013-03-19 18:14:53

+1

更好地描述'強制垃圾收集',因爲這可能意味着幾件事情。使用C#來避免混淆。 – 2013-03-19 18:15:50

+1

從容器中刪除控件確​​實不會導致它們被破壞。這個想法是,你可能想從一個容器中移除一個控件,並立即將它添加到另一個容器中。因此,您需要手動處理從容器中刪除後不再需要的銷燬控件。 – 2013-03-19 18:15:51

回答

1

除非你的類擁有非託管資源,否則不應該依賴或使用析構函數。

在你的例子中,像事件訂戶這樣的東西可能持有對TabItem的引用,從而阻止垃圾收集。

+0

我已經在上面添加了示例代碼。我沒有添加事件處理程序,但似乎仍有潛在的參考。 – user2187743 2013-03-19 19:45:29