2013-02-12 35 views
6

我正在用.NET的System.DirectoryServices.AccountManagement命名空間做一些Active Directory工作。我注意到Principal實現了IDisposable,這導致了一種頭痛,因爲所有的都在那個命名空間中繼承了Principal我真的需要在每個Principal上調用Dispose()嗎?

E.g.考慮下面的代碼讓所有的用戶組中:

PrincipalContext domain = new PrincipalContext(ContextType.Domain); 
GroupPrincipal group = GroupPrincipal.FindByIdentity(domain, "MyGroup"); 
PrincipalSearchResult<Principal> users = group.GetMembers(); 

在該段每一個類型實現IDisposable,包括所有由搜索並設置自己的搜索結果返回用戶。

處理domaingroup對象並不是什麼大事(對using()塊來說很容易),但是我對每個結果做了什麼?我是否真的需要循環收集並處理每一個?

+0

FWIW,[GroupPrincipal.GetMembers](http://msdn.microsoft.com/en-us/library/bb339975.aspx)僅顯示正在處理的組。我找不到任何明確聲明「會員一生所有權」合同的文檔(還沒有):+1,因爲我確實發現了這個特定的合同(或者可能缺乏這個合同),這很有趣。但是,這是我的[關於IDisposable合同的一般視圖](http://stackoverflow.com/a/14781766/166390)。 – 2013-02-12 21:19:28

+2

這裏的答案可能有所幫助:http://stackoverflow.com/a/14627265/2258 – 2013-02-12 21:26:03

回答

4

IDisposable合同就是這樣一個合同。預計將遵循。如果您沒有「需要調用Dispose」,他們就不會執行合同...

實際上,您無法真正知道某個特定實例使用的對象類型是什麼有時,您必須處置它,有時候你不要。除非你知道某個特定實現的內部部分,否則你實際上沒有辦法在運行時告訴它。例如,如果Principle實例中的基礎對象是DirectoryEntry,那麼您應該處置它。但是,您並沒有真正的方法來在運行時告訴底層對象是什麼。即使你可能,簡單地稱爲Dispose似乎更容易。

+2

對,我知道所有東西都需要處置。我只是覺得我在「負責」這個問題上感到困惑。我通常的假設是,如果我實例化一個對象,我負責清理它,但顯然不適用於這些類。 MSDN文檔完全沒有幫助:他們的大多數樣本根本沒有Dispose()調用。 – 2013-02-12 23:59:46