2010-02-24 12 views
15

Al igual que el título dice:¿Cómo puede TcpClient implementar IDisposable y no tener un método de eliminación pública?

¿Cómo puede TcpClient implementar IDisposable y no tener un método de eliminación pública?

+1

Cuando estoy usando intellisense para familiarizarme con una interfaz desconocida (probablemente sea malo, lo sé), esta es una de las frustraciones de mi mascota porque hay pocas indicaciones que una declaración de uso sería apropiada. – spender

+0

Hablando de 'using', nunca he encontrado una variable desechable local en mi vida. Todos mis desechables son miembros. Así que estoy desconcertado por toda la rabia 'usar'. – CannibalSmith

+0

@CannibalSmith: 'using' es un _replacement_ para mantenerlos como miembros, para cosas que realmente solo son relevantes en el área' using'. Uno de sus usos es abrir una base de datos o una conexión de red, realizar las operaciones que necesita hacer y luego cerrarla automáticamente. – Nyerguds

Respuesta

11

Al usar explicit interface implementation. En lugar de

public void Dispose() 
{ 
    ... 
} 

tendría

void IDisposable.Dispose() 
{ 
    ... 
} 

Varios otros tipos hacen esto; a veces no es necesario (por ejemplo, es compatible con IEnumerable.GetEnumerator y IEnumerable<T>.GetEnumerator) y en otras ocasiones expone una API más adecuada cuando se conoce el tipo concreto.

+0

Entonces, en este caso, ¿cuál es la forma recomendada de desecharlo adecuadamente? Llamando al método Dispose() explicándolo a IDisposable, o llamando a TcpClient.Close()? – KFL

+1

@KFL: solo puede usar una instrucción 'using'; esa es normalmente la mejor opción. Si no puede usar una instrucción 'using', llamar' Close' está bien. –

3

Ver explicit interface implementation. Debe emitir explícitamente la instancia de TcpClient a IDisposable, o envolverla en un bloque using() {...}. Tenga en cuenta que las clases que implementan IDisposable explícitamente a menudo proporcionan un método público Close() en su lugar

Cuestiones relacionadas