簡單來說,就是作用域的問題。如果對象的作用域是在像Main函數這樣與程序運行同生共死的區域中,這個對象的內存(那怕變量已經置空了)會在程序結束運行後才被回收,而析構器也會在程序結束的時候才被調用。
換而言之,如果對象的作用域是在單獨的一個函數(如:static void DoStuff())中,再在Main裡調用這個函數DoStuff(),然後調用GC.Collect(),那一切將能正常運行。因為對象的作用域是在DoStuff函數內,DoStuff函數執行完畢後,函數裡聲明的對象內存也會隨之被回收,析構函數也能正常被調用。如以下測試用例: