2010-02-24 13 views
15

Proprio come dice il titolo:Come può TcpClient implementare IDisposable e non disporre di un metodo Dispose pubblico?

Come può TcpClient implementare IDisposable e non disporre di un metodo Dispose pubblico?

+1

Quando guido intellisense per avere un'idea di un'interfaccia non familiare (probabilmente cattiva, lo so), questa è una delle mie frustrazioni personali perché c'è poca indicazione che una dichiarazione usando sarebbe appropriata. – spender

+0

Parlando di 'using', non ho mai incontrato una variabile usa e getta nella mia vita. Tutti i miei articoli usa e getta sono membri. Quindi sono perplesso da tutta la rabbia dell'uso. – CannibalSmith

+0

@CannibalSmith: 'using' è un _replacement_ per tenerli come membri, per cose che sono veramente rilevanti solo nell'area' using'. Uno dei suoi usi è l'apertura di un database o una connessione di rete, l'esecuzione delle operazioni da eseguire e la chiusura automatica. – Nyerguds

risposta

11

utilizzando explicit interface implementation. Invece di

public void Dispose() 
{ 
    ... 
} 

avrebbe

void IDisposable.Dispose() 
{ 
    ... 
} 

vari altri tipi fanno; a volte è fuori necessità (ad esempio supportando IEnumerable.GetEnumerator e IEnumerable<T>.GetEnumerator) e altre volte è necessario esporre un'API più appropriata quando il tipo concreto è noto.

+0

Allora, in questo caso, qual è il modo consigliato di smaltirlo correttamente? Chiamando il metodo Dispose() rilasciandolo esplicitamente su IDisposable o chiamando TcpClient.Close()? – KFL

+1

@ KFL: puoi semplicemente usare una istruzione 'using' - normalmente è l'opzione migliore. Se non puoi usare un'istruzione 'using', chiamare' Close' va bene. –

3

Vedere explicit interface implementation. È necessario eseguire il cast esplicito dell'istanza di TcpClient su IDisposable o di inserirlo in un blocco using() {...}. Si noti che le classi che implementano IDisposable esplicitamente forniscono un metodo pubblico Close() invece

Problemi correlati