我堅持使用.net 1.1應用程序(即我現在不能使用2.0的泛型好東西),並且我試圖優化某些部分碼。由於它處理了很多需要發佈的運行時可調用包裝器,因此我最終創建了一個實用程序方法,該方法循環直到所有引用都被釋放。該方法的簽名是:使用「ref」和/或「out」對象類型
void ReleaseObject(object comObject)
釋放所有comObjects後,我調用GC.Collect和GC.WaitForPendingFinalizers(不要問 - 任何人處理與Office的互操作都知道)。與往常一樣,我遇到了一個角落案例 - 如果我在GC.Collect調用之前未將相應的託管引用分配給null,則它不會正確清理。
所以,我的代碼如下所示:
ReleaseObject(myComObject);
myComObject = null;
GC.Collect()
...
至於,還有一堆的XXX = NULL,我決定把這個在UTIL方法,但有傳之間的差異參考,並通過一個基準參數,很明顯,我不得不改變方法:
void ReleaseObject(out object comObject)
{
//do release
comObject = null;
}
和編輯來電者:
MyComClass myComObject = xxxx;
ReleaseObject(out myComObject);
這將失敗並顯示一條消息:「無法從'MyComClass'轉換爲'out object'」
雖然我可以想到它爲什麼會成爲問題(即,從對象到MyComClass的反向投射不是隱含的,並且不能保證該方法會做什麼),我想知道是否有解決方法,或者我需要保留我的數百個空值任務。
注:我有一堆不同的COM對象類型,這就是爲什麼我需要一個「對象」參數,而不是一個類型安全的。
@Jon:= null重複操作 - 這個重構:); RCW不是IDisposable;它是Office interop特定的,我需要在範圍結束前強制GC。正如我所說,我可以保持原樣,但我很好奇是否有辦法使用「out」來做到這一點。 – 2008-10-28 21:04:47
你會重構「重複設置變量爲空」到「重複製作方法調用」 - 哪裏有好處? 至於是否需要這樣做 - 將變量設置爲null不會強制GC。發生了什麼(在發佈模式下,不在調試器下,重要)......(續) – 2008-10-28 21:30:26
如果您調用GC.Collect()而不將其設置爲null?如果它們是局部變量,那應該沒問題。 – 2008-10-28 21:31:09