2010-02-15 6 views
2
Class ComponentsContainer ' a component contains other components' 
    Inherits System.ComponentModel.Component 

    Private foo as New Component 
    Private bar as New Component 

Protected Override Sub Finalize() 
    foo.Dispose() ' HERE ? ' 
    bar.Dispose() 
    MyBase.Finalize() 
End Sub 

Protected Overrides Sub Dispose(disposing As Boolean) 
    If disposing Then 
     foo.Dispose() ' OR HERE ? ' 
     bar.Dispose() 
    End If 
    MyBase.Dispose(disposing) 
End Sub 
End Class 

답변

3
당신은 파이널에서 관리 자원을 폐기 (필요가 없습니다) 안

:

Protected Override Sub Finalize() 
    ' foo.Dispose() ' 
    ' bar.Dispose() ' 
    MyBase.Finalize() 
End Sub 

그리고 그에서이 클래스는 관리되지 않는 자원이없는 경우 당신이 필요로하지 않는 다음을 파이널 라이저.

참고 : 클래스에 Public Sub Dispose() 오버로드가 없습니다.

편집 : (구성 요소를 확장)

foo 이후 및 bar 관리하는 자원은 당신은 단지 Protected Overrides Sub Dispose(disposing As Boolean) 방법이 필요합니다. 문제의 버전이 맞습니다. 그리고 간단히 Finalize()을 입력하십시오.

+0

'Public Sub Dispose' 오버로드가 의심 스럽습니다. – MarkJ

+0

내가 상속 한 곳에서 설명하는 코드를 업데이트했습니다. 두 개의 다른 구성 요소가 포함 된 구성 요소가 있습니다. – serhio

+0

@ MarkJ, 당신은 정확하고, serhio는 그것을 확실하게했다. –

3

finalizer는이 클래스가 소유하고있는 객체를 직접 처리하지 않고이 클래스 'Dispose passing false'를 호출해야합니다. MSDN을 참조하십시오.

편집 : 그래서 질문에 답하기 위해 소유 한 객체를 폐기하는 것이 완료, 완료가 아닌 배출로 수행되어야합니다.

편집 2 : 공지 사항,이 개체가 배치되지 않고 마무리되면, 폐기 만 "false"를 매개 변수 (의 Finalize로) 전화를받을 것이고, 자식 개체가이에 의해 배치되지 않음을 의미 수업. 이는 관리 객체이므로 프레임 워크가 명시 적으로 삭제되지 않은 것처럼 느껴질 때 마무리됩니다.

+0

수정하십시오. 이 예제에서 Dispose (False)는 아무 것도하지 않습니다 (아마도 기본 클래스를 제외하고). Finalize 및 Dispose (bool)를 제거하는 것이 가장 좋은 방법입니다. –

+0

결국, foo와 bar는 어디에 처리해야합니까? – serhio

+0

Dispose 메서드에서. – BlueMonkMN

1

Dispose 가비지 수집기가 개체를 해제하기 전에 명시 적으로 일부 리소스를 해제하려는 경우입니다.

가비지 수집기가 객체를 해제 할 때 자동으로 호출되거나 호출 될 때 자동으로 호출됩니다.

가비지 수집을 제어해서는 안되므로 많은 자원을 보유하고있는 개체가있는 경우 Dispose를 사용해야합니다. 프레임 워크 문서에서

: 심지어 당신이 Finalize 메서드를 사용하여 암시 적 정리 을 제공해야 폐기의 방법으로 명시 적으로 제어를 제공

참고. Finalize 프로그래머가 Dispose를 호출하지 못하면 이 영구적으로 누출되지 않도록 백업을 제공합니다. 당신이 상속 무엇

Implementing Finalize and Dispose to Clean Up Unmanaged Resources

+0

제 경우 명시적인 정리는'foo.Dispose'와'bar.Dispose' 여야합니다. 제 경우에는 Finalize에서 "암시 적 정리"를 의미 할 수 있습니다 ... – serhio

1

? 나는 그것이 직접 또는 간접적으로 System.ComponentModel.Container일지도 모른다라고 생각한다.

이 경우 아무 것도 할 필요가 없습니다. System.ComponentModel.Container automatically은 포함 된 모든 구성 요소를 Dispose 메서드로 처리합니다. 그것을 혼자서 버리십시오 - dispose/finalize 패턴을 구현하는 가장 쉬운 방법입니다.

+0

'System.ComponentModel .Component'. 코드를 업데이트했습니다. – serhio

+0

대신 Container에서 상속하지 않는 이유는 무엇입니까? 그것이 바로 그 때문입니다. – MarkJ

+0

실제 프로젝트에서는 VisualBasic.PowerPacks.Shape (구성 요소)를 사용합니다. 그래서, 몇 가지 내부 모양 (선)을 포함하는 사용자 정의 (여러 줄) 모양이 있습니다. – serhio

관련 문제