2008-11-10 7 views
1

모든 클래스에서 Dispose 패턴을 레코딩하는 대신 DisposableBase base class을 사용하는 데 catch 또는 숨겨진 문제가 있습니까?DisposeBase 추상 클래스를 구현할 수 있습니까?

그런 사람들을 사용하는 모든 사람이 왜 과 관련하여 클래스입니까?

편집 :

  1. 는 IDisposable

  2. 나는 그것이 상속에 대한 옵션을 사용하여 알아,하지만 내가 가격을 지불 할 용의있어 구현 I 자연스럽게만을 의미 클래스 (적어도 나는 할 수있을 때 그것을 다치게하지 않는다).

  3. 클래스를 봉인 할 수 있지만 상속 계층 구조의 기본이 일회용이되도록하려는 경우가 있습니다. 결정적 정리를 필요로 뭔가 단지 그 -

답변

2

당신은 에 모든 클래스를 폐기()를 구현할 필요가 없습니다. 다시 일회용베이스 클래스, 전적으로 많이 제공 확실하지 않다 - IDisposable은 복잡한 인터페이스가 아닙니다. 그것이 관리되지 않는 리소스를 처리하고 파이널 라이저를 원한다면 유용 할 수 있지만, 그다지 많은 코드는 아닙니다.

개인적으로, 나는 그런 기본 클래스에 신경 쓰지 않을 것입니다. 특히 상속 (단일 상속 세계에서)은 매우 신속하게 제한됩니다. 하지만 더 중요한 것은 메서드를 재정의하는 것이 단순히 공용 Dispose() 메서드를 제공하는 것과 크게 다르지 않다는 것입니다.

다시 : 관리되지 않는 개체를 처리하는 경우에만 최종 자 등이 필요합니다.

이러한 (관리되지 않는 리소스)가 많으면 나를 위해 PostSharp을 얻을 수 있는지 확인할 수 있습니다. 하나가 이미 존재하는지 모르겠지만, 은 (특히) 파이널 라이저 등을 처리하는 측면을 생성 할 수 있습니다 ...

+0

원래 게시물의 편집을 참조하십시오. – ripper234

2

글쎄, 그것은 하나의 상속 옵션을 사용합니다 클래스의 한 측면을 묘사하는 것이 이상적이지는 않습니다. 흥미로운 일이지만, DisposableHelper에 대한 참조가 있고 IDisposable의 구현은 helper.Dispose를 호출합니다. 여기에는 나머지 상용구 논리가 있으며 -를 통해 코드를 다시 호출 할 수 있습니다. 콜백 대리인. 흠. 서브 클래스는 보호 된 Disposing 이벤트에 가입하여 "나는 뭔가를해야한다"라고 등록 할 수 있습니다. 언젠가는 가치가있을 것입니다.

개인적으로는 종종 IDisposable을 구현하여 문제가 될만큼 자주 찾지 못합니다. 그럴 경우 일반적으로 어쨌든 클래스를 봉인하므로 패턴의 절반이 문제가되지 않습니다.

+0

저는 작곡이 효과가 있다고 생각하지 않습니다. 도우미 클래스는 IDisposable 클래스 전에 가비지 수집되었을 수 있습니다. – Mendelt

+0

도우미에 대한 참조는 GC가 그렇게하지 못하도록합니다. –

+0

GC는 실제로 범위 어딘가에있는 객체에서 발생한 참조 만 사용합니다. 도우미는 필요할 때 객체에 있어야한다는 것을 보장하기 위해 객체 이외의 것으로부터 참조해야합니다. 어딘가에 도우미 컬렉션을 유지하는 것이 도움이 될 수 있지만 이는 까다로울 수 있습니다. – Mendelt

1

Marc Gravell이 말했듯이 관리되지 않는 개체를 처리하는 경우에만 최종 자만 필요합니다. 기본 클래스에서 불필요한 종료자를 소개하는 것은 Dispose, Finalization, and Resource Management 가이드 라인의 섹션 1.1.4의 이유에 따라, 나쁜 생각 :

파이 나라와 인스턴스와 관련된 실제 비용이 성능에서 모두있다 코드 복잡도는 입니다. ...각 종료 가능한 객체가 기본적으로 개체에 를 참조 여분의 포인터 크기의 필드를 생성, 할당 된 특별한 종료 자 등록 큐 에 배치해야하기 때문에 마무리는 비용과 개체의 수명의 지속 시간을 증가시킨다. 또한 의 개체는 GC 도중 처리되고 이 처리되어 결국 으로 승격되어 GC가 에 finalizer를 실행하는 데 사용됩니다. 종료 가능한 개체 수를 늘리면 직접 더 오브젝트 상관은 높은 세대 승격 및 는 GC 걸어 큐가 시간의 양을 증가 주위 포인터 이동 및 종료 자을 실행. 또한 개체의 상태를 으로 유지하면 더 오랜 시간 동안 메모리를 사용하는 경향이 있습니다. 은 작업 집합의 증가를 가져옵니다.

SafeHandle (및 관련 클래스)을 사용하는 경우 DisposableBase에서 파생되는 클래스는 확정 될 필요가 없습니다.

관련 문제