2010-07-19 6 views
3

(매우 초보자 질문)모든 클래스가 IDisposable 인터페이스를 구현해야합니까?

나는 이것을 오해하지만 MSDN에서는 쓰는 모든 클래스에 Dispose 소멸자를 구현하는 것이 좋습니다. 내가 (당신이) 정말 모든 클래스 내가 쓰는 IDisposable 인터페이스를 구현해야합니까?

또한 "클래스"선언 다음에 줄에 "Implements"키워드를 넣을 수있는 인터페이스를 구현하는 데 적합한 구문입니까? 나는 "클래스"와 같은 줄에 넣었고 오류가 발생했습니다.

하나의 인터페이스에 의해 구현되는 방법을 코딩 할 때, 그것은 예를 들어,이 구문을 따라야하는 필수? 더 :

Public Sub Dispose() Implements IDisposable.Dispose 

내가, 위의 코드에 대해 궁금하는 경우입니다 난 이 클래스는 네이티브 자원을 보유하고있는 경우 IDisposable을 구현, 또는 다른 클래스의 인스턴스를 포함하는 경우에만 IDisposable를 구현해야

+2

가능한 중복 [왜 클래스는 IDisposable을 구현하는 것이 명시 적으로 대신 : 좋은 예는는 IDisposable 인터페이스를 구현하는 방법을 볼 수는 IDisposable 인터페이스를

확인이를 데이터베이스 연결을 처리하고 사용하는 DataAccesslayer를 만드는 암시 적으로?] (http://stackoverflow.com/questions/3119288/why-would-a-class-implement-idisposable-explicitly-instead-of-implicitly) –

+1

마지막 두 질문에 대한 빠른 답변 : '구현'(및 'Inherits')는 구현 된 인터페이스 (상속 된 클래스)를 선언 할 때 클래스 내부 몸체에 있어야하고 메소드 선언에있는'Implements'는 같은 줄에 있어야하며 인터페이스를 구현하는 모든 메소드 (하프 이름이 일치하지 않으면 n). –

+1

# 1에 대한 간단한 대답 : 아니요, 모든 클래스가 'IDisposable'을 구현해야하는 것은 아니며, MSDN이 그렇게하지 말라고 말하지 않습니다. 긴 대답 - http://stackoverflow.com/questions/492984/what-is-the-difference-between-managed-and-native-resources-when-disposing-ne –

답변

10

"System.IDisposable.Dispose를 구현합니다"로 구현하는 방법을 선언해야합니다.

자세한 내용은 this article을 참조하십시오.

3

아니요. 관리되지 않는 리소스를 직접 사용하거나 IDisposable을 구현하는 멤버가 있고 클래스에서 dispose 메서드가 호출 될 때 dispose 메서드가 호출되도록하려면 IDisposable 만 구현하십시오.

+0

클린업이 필요한 객체를 생성하는 팩토리 메소드에 의해 클래스 또는 인터페이스 유형이 반환 될 가능성이있는 경우 상속을 위해 설계된 클래스 또는 인터페이스입니다. 가장 좋은 예는'IEnumerator '입니다. 'IEnumerator '을 구현하는 클래스의 99.9 %가 정리를 필요로하지 않더라도, 임의의'IEnumerable '을 받아 들일 수 있고 그것에 대해'GetEnumerator'를 호출하는 코드는 정확하게 반환 된 열거 자에 대해 Dispose를 호출해야합니다. 그렇게하지 않는 코드는 모든 타입의'IEnumerable '을 합법적으로 받아 들일 수 없습니다. – supercat

+0

제네릭이 아닌'IEnumerator'는'IDisposable' *을 구현하지 않습니다. 그러나 임의의'IEnumerable'을 받아 들일 수있는 코드는 GetEnumerator를 호출 할 수 있기 때문에 반환 된 열거 자의 구현 여부를 검사하기 위해 정확해야합니다. 그렇다면 'IDisposable'을 삭제하십시오. * IEnumerator를 구현하는 클래스의 99.9 %는 정리가 필요하지 않습니다. * IEnumerator가 'IDisposable'을 구현하지 않는다고해서 호출자의 책임을 덜어주지는 않습니다. 그들을 수행하기 위해 그들. – supercat

2

컴퓨터가 수행 할 수있는 많은 작업으로 카운터 밸런싱 "정리"작업이 필요합니다. 예를 들어 파일을 여는 행위로 인해 파일을 닫아야합니다. 모뎀으로 전화를 걸면 연결을 끊어야합니다. 필요한 카운터 밸런싱 정리를 수행하지 않고 작업을 수행하는 것은 때로는 무해하지만 컴퓨터 또는 실제 환경에서 심각한 결과를 초래할 수 있습니다. 모뎀 연결을 종료하지 못하면 과다한 전화 요금으로 인해 많은 비용이 발생할 수 있습니다.

IDisposable의 목적은 잘 수행 된 프로그램이 실제로 수행되어야하는 정리 작업을 실제로 수행 할 수 있도록하는 수단을 제공합니다. 정리에 의해 균형을 맞추어야하는 작업을 수행하는 모든 루틴은 수행 된 시간까지 그러한 정리를 수행하는 데 필요한 정보와 추진력을 유지해야합니다. 루틴이 호출자에게 반환하기 전에 정리를 수행 할 수 없으면 호출자에게 정보를 제공하고 호출자가 정보를 사용하여 정리를 수행하도록 요구하는 것으로 문서화해야합니다. 또는 (2) 하나 이상의 필드에서 필요한 정보를 수집하고 IDisposable을 구현합니다. IDisposable.Dispose가 호출되면 개체는 저장된 정보를 사용하여 정리를 수행해야합니다.

IDisposable은 IDisposable 개체 생성을 요청하는 개체가 받아 들일 수 있고 개체의 IDisposable.Dispose 메서드가 언젠가 호출되도록하는 책임을 받아들이는 경우에만 올바르게 작동합니다. 시스템은 최종화라고하는 "백업"수단을 제공하며,이 수단을 사용하여 정리를 수행 할 수 있습니다. 본질적으로 객체는 "내가 버려 졌는지 알려줘"라는 시스템에 요청을 등록합니다. 시스템이 객체가 버려진 것을 감지하면 필요한 정리 작업을 수행 할 수있는 기회를 객체에 부여하려고 시도합니다. 객체가 포기되었음을 알기까지 시스템이 잠시 시간을 소요 할 수 있으며 여러 가지 이유로 알림이 항상 발생하는 것은 아닙니다. 버려지기 전에 객체에 IDisposable.Dispose를 호출하는 것이 "마지막 기회"마무리 메커니즘에 의존하는 것보다 거의 항상 더 좋습니다.

0

.Net 프레임 워크에는 가비지 수집기가 있으며 대부분 새 개체를 만들 때 메모리 할당 및 해제를 관리합니다. 그러나 또한 관리되지 않는 리소스를 관리해야합니다 (또한 네이티브 리소스로 간주되는 것으로 나타났습니다). 이제는 가비지 컬렉터가 충분하지 않으므로 IDisposable 인터페이스를 사용하여 메모리를 관리해야합니다. 이 https://msdn.microsoft.com/en-us/library/498928w2%28v=vs.110%29.aspx

관련 문제