2010-02-24 9 views
15

Tak jak mówi tytuł:W jaki sposób TcpClient może implementować IDisposable i nie mieć publicznej metody Dispose?

W jaki sposób TcpClient może implementować IDisposable i nie mieć publicznej metody Dispose?

+1

Kiedy jadę intellisense, aby czuć się na nieznanym interfejsu (prawdopodobnie zły, wiem), jest to jeden z moich frustracji domowych, ponieważ niewiele jest wskazanie że stosowne oświadczenie byłoby właściwe. – spender

+0

Mówiąc o 'użyciu', nigdy w życiu nie spotkałem lokalnej zmiennej jednorazowej. Wszystkie moje materiały jednorazowe są członkami. Więc jestem zaintrygowany przez wszystkie "wściekłe" użycie. – CannibalSmith

+0

@CannibalSmith: 'using' to _replacement_ dla zachowania ich jako członków, dla rzeczy, które są naprawdę istotne tylko w obszarze' using'. Jednym z jego zastosowań jest otwieranie bazy danych lub połączenia sieciowego, wykonywanie operacji, które należy wykonać, a następnie automatyczne zamykanie. – Nyerguds

Odpowiedz

11

Za pomocą explicit interface implementation. Zamiast

public void Dispose() 
{ 
    ... 
} 

musiałby

void IDisposable.Dispose() 
{ 
    ... 
} 

Różne inne typy to zrobić; czasami jest to konieczne (na przykład obsługa IEnumerable.GetEnumerator i IEnumerable<T>.GetEnumerator), a innym razem ma na celu odsłonięcie bardziej odpowiedniego API, gdy znany jest typ betonu.

+0

W takim razie, jaki jest zalecany sposób prawidłowego pozbycia się go? Wzywając metodę Dispose(), jawnie przesyłając ją do IDisposable lub wywołując TcpClient.Close()? – KFL

+1

@KFL: Możesz po prostu użyć instrukcji 'using' - to zwykle najlepsza opcja. Jeśli nie możesz użyć instrukcji 'using', wywołanie' Close' jest w porządku. –

3

Zobacz explicit interface implementation. Musisz jawnie rzucić instancję TcpClient na IDisposable lub owinąć ją w blok using() {...}. Zauważ, że klasy, które implementują IDisposable wyraźnie często zapewniają publiczną metodę Close() zamiast

Powiązane problemy