2013-05-08 1 views
6

Ho una classe con questo campo:Perché il metodo Dispose() non è disponibile sul mio oggetto IDisposable?

private WcfChannelFactory<IPrestoService> _channelFactory; 

Nel metodo Dispose(), sto facendo questo:

if (_channelFactory != null) { _channelFactory.Dispose(); } 

Ma che produce un errore:

Cannot access explicit implementation of IDisposable.Dispose

Dopo aver fatto alcuni research, sembra che io possa disporre in questo modo:

if (_channelFactory != null) { (_channelFactory as IDisposable).Dispose(); } 

Non capisco due cose:

  1. Perché non Dispose() è disponibile? WcfChannelFactory<T> deriva da ChannelFactory<T>, che deriva da ChannelFactory, che implementa IDisposable. Eppure lo ChannelFactory non ha un metodo Dispose(). Com'è possibile?

  2. Se potessi (dovrebbe?) Semplicemente chiamare Close() su _channelFactory, perché lo stato non la documentazione XML che Close() sarà anche chiamare Dispose()? Forse non lo farà? Questo è confusionario.

risposta

7
  1. Poiché il metodo è implementato Dispose explicilty per l'interfaccia IDisposable, si può vedere solo il metodo quando si ha un riferimento del tipo IDisposable. Il metodo è lì, ma non puoi vederlo quando hai un riferimento di un tipo diverso. È simile a come un metodo privato è visibile solo dal codice all'interno della classe stessa, sebbene sia sempre presente.

  2. Il metodo Close non chiamerà Dispose per questa classe. Il metodo non chiude la fabbrica, avvia un processo di chiusura asincrona. Quando il metodo Close termina, il processo di chiusura non è terminato, quindi l'oggetto non può essere smaltito in quel momento.

+0

Così come faccio a smaltire '_channelFactory'? Dovrei chiamare 'Close()'? Dovrei chiamare 'Dispose()'? –

+0

@Bob, non importa. Ho letto male la tua domanda originale Sembra che tu stia implementando il tuo schema monouso. –

+0

@AnthonyPegram Non posso. Il metodo restituisce '_channelFactory'. Il consumatore sta avvolgendo la chiamata in un 'using', quindi la mia classe deve implementare' IDiposable' e dipingerne. –

2

Il metodo Dispose è stato implementato come un membro esplicito dell'interfaccia IDisposable. Cioè, la definizione simile a questa:

public class WcfChannelFactory<T> : IDisposable 
{ 
    public void IDisposable.Dispose() 
    { 
     ... 
    } 
} 

Tutorial: Explicit Interface Implementation Tutorial

+0

So quale implementazione di interfaccia esplicita è. Grazie! –