我正在調試一些C#類(讓我們說,Foo),它有一個Dispose-Finalize模式實現,即它的Finalizer調用Dispose(),如果Dispose尚未被調用。GarbageCollector無效成員字段?
在Dispose()中有訪問Foo的某個成員(比方說Bar)的日誌代碼。 Bar也是一些引用類型的實例,是隻讀的(在Foo的構造函數中創建的),並且不會暴露在Foo之外的任何地方。所以,在Foo的垃圾回收時,Bar很可能已經被收集了。該理論說,不應該從Finalize線程訪問這些成員字段。
但是日誌代碼沒有意識到理論,並嘗試記錄酒吧的一些屬性。並且該進程在Finalizer的線程中與NullReferenceException一起崩潰。
我明白,當你忽視理論時可能會發生不好的事情,但我並不期待NRE:垃圾收集器是否將收集到的對象的引用srt爲空?還是我錯過了別的?
請參閱http://stackoverflow.com/questions/2327352/is-it-safe-to-access-a-reference-type-member-variable-in-a-finalizer –
我不知道它是否實際上將其設置爲null,但如果其內存已被回收,則無法訪問該對象,因此必須執行某些操作或拋出一些錯誤。 –