2010-02-24 2 views
15

제목과 마찬가지로 :TcpClient가 IDisposable을 구현하고 공용 Dispose 메서드를 구현하지 못하는 이유는 무엇입니까?

TcpClient는 IDisposable을 구현하고 공용 Dispose 메서드를 사용할 수 없습니까?

+1

익숙하지 않은 인터페이스 (아마도 나쁘다는 것을 알고 있습니다.)에 대한 느낌을 얻으려고 intellisense를 타고있을 때, 이것은 약간의 표시가 있기 때문에 내 애견 중 하나입니다. using 문이 적절할 것입니다. – spender

+0

''사용 중 '이라고 말하면서, 나는 일생에 지역 일회용 변수를 만난 적이 한번도 없습니다. 내 모든 일회용품은 회원입니다. 그래서 저는 모든 '사용하는'분노에 의아해합니다. – CannibalSmith

+0

@CannibalSmith :'using'은 멤버로 유지하기위한 _replacement_이며, 실제로'using' 영역에서만 관련이 있습니다. 그 중 하나는 데이터베이스 또는 네트워크 연결을 열고, 필요한 작업을 수행 한 다음 자동으로 닫는 것입니다. – Nyerguds

답변

11

explicit interface implementation을 사용하면. 대신

public void Dispose() 
{ 
    ... 
} 

의 그것은

void IDisposable.Dispose() 
{ 
    ... 
} 

다양한 다른 유형이 작업을 수행 할 것이다; 경우에 따라 필요하지 않은 경우가 있습니다 (예 : IEnumerable.GetEnumeratorIEnumerable<T>.GetEnumerator). 구체적인 유형을 알고있을 때 더 적절한 API를 노출하는 경우도 있습니다.

+0

그런 다음 적절하게 처분 할 때 권장되는 방법은 무엇입니까? 명시 적으로 IDisposable로 캐스팅하거나 TcpClient.Close()를 호출하여 Dispose() 메서드를 호출 할 수 있습니까? – KFL

+1

@KFL : 'using'문을 사용할 수 있습니다 - 일반적으로 최선의 선택입니다. 'using' 문을 사용할 수 없다면'Close'를 호출하는 것이 좋습니다. –

3

explicit interface implementation을 참조하십시오. TcpClient의 인스턴스를 IDisposable으로 명시 적으로 캐스팅하거나 using() {...} 블록으로 마무리해야합니다. IDisposable을 구현하는 클래스는 명시 적으로 public 메서드 Close()을 제공합니다.

관련 문제