2013-02-12 15 views
6

Sto facendo un po 'di lavoro con Active Directory con lo spazio dei nomi di .NET System.DirectoryServices.AccountManagement. Ho notato che Principal implementa IDisposable, che causa una sorta di mal di testa dal a tutto lo in quello spazio dei nomi eredita Principal.Devo davvero chiamare Dispose() su tutti i Preside?

E.g. considerare il seguente codice per ottenere tutti gli utenti di un gruppo:

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

Ogni singolo tipo in quel frammento di implementa IDisposable, tra cui tutti gli utenti restituiti dalla ricerca e il risultato della ricerca si è posta.

Smaltire gli oggetti domain e group non è un grosso problema (sarebbe facile con un blocco using()), ma cosa devo fare per ogni risultato? Devo davvero passare attraverso la collezione users e smaltirne tutti?

+0

FWIW, [GroupPrincipal.GetMembers] (http://msdn.microsoft.com/en-us/library/bb339975.aspx) mostra solo il gruppo in fase di eliminazione. Non riesco a trovare alcuna documentazione (ancora) che dichiari esplicitamente questo contratto di "proprietà a vita del membro": +1 perché trovo questo particolare contratto (o forse la sua mancanza), interessante. Tuttavia, ecco la mia [visione generale sul contratto IDisposable] (http://stackoverflow.com/a/14781766/166390). –

+2

Ecco una risposta che può aiutare: http://stackoverflow.com/a/14627265/2258 –

risposta

4

Il contratto IDisposable è proprio questo, un contratto. Dovrebbe essere seguito. Non avrebbero implementato il contratto se non avessi "bisogno di chiamare Dispose" ...

In realtà, non puoi realmente dire quale tipo di oggetto viene utilizzato da una particolare istanza di Principal A volte, è è necessario smaltire lo, a volte si non. Non hai davvero un modo di raccontare al runtime a meno che tu non conosca alcuni dei componenti interni di un particolare strumento di Principal. Ad esempio, se l'oggetto sottostante nell'istanza Principle è un DirectoryEntry, è necessario smaltirlo. Ma non hai modo reale di dire al momento dell'esecuzione cosa sia l'oggetto sottostante. Anche se si potrebbe, sembrerebbe più semplice chiamare semplicemente Dispose.

+2

Giusto, so che tutto deve essere smaltito. Mi sembra di confondere ciò di cui sono "responsabile". La mia solita ipotesi è che se istanzio un oggetto sono responsabile della sua pulizia, ma ovviamente non si applica a queste classi. I documenti MSDN sono del tutto inutili: la maggior parte dei loro esempi non ha chiamate 'Dispose()'. –

Problemi correlati