2012-05-17 4 views

답변

5

컨트롤의 Components 컬렉션에 ImageList를 추가해야합니다. 그런 다음 Dispose의 기본 클래스 구현은 해당 컬렉션의 모든 항목을 삭제합니다. 그러면 Dispose를 직접 재정의 할 필요가 없습니다.

IDisposable이지만 Components가 아닌 멤버가있는 경우 컨트롤에서 Dispose를 무시하고 직접 처분해야합니다.

(System.ComponentModel.Component에서 파생 된 개체의 엄격한 의미에서 Component라는 용어를 사용하고 있습니다.)

+2

어떤 일관된 패턴이 있습니까 컨트롤이는 IDisposable 속성의 소유권을 가지고있는 사람은하지 않는 윈폼되는? 필자가 이해할 수있는 것은'Image' 속성 (일반적으로 컨트롤이 소유하지 않음)과 같은 것입니다. 컨트롤의 'Image' 속성을 컨트롤 이외의 용도로 필요하지 않은 그림으로 설정하는 코드는 컨트롤 자체도 첨부해야합니다 그 컨트롤의'Disposed' 이벤트에 그리고'Dispose' 컨트롤이'Dispose'd 일 때 이미지를 지우지 만, 모든 속성이 그런 식으로 작동하는 것은 아닙니다. 'Font' 속성은 정말로 이상하게 보입니다 ... – supercat

+2

... 컨트롤의'Font' 속성을 이미 배치 된 글꼴로 설정하고 컨트롤이 괜찮습니다. 그게 좋은 생각인지 나쁜 생각인지 모르겠지만 작동하는 것 같습니다. – supercat

5

article은 메모리 폐기 섹션에서 매우 유용합니다.

IDisposable (모든 Windows Forms 컨트롤 포함)을 구현하는 모든 클래스에는 Dispose 메서드가 있습니다. 메모리 이외의 리소스를 해제하기 위해 객체가 더 이상 필요하지 않은 경우이 메서드를 호출해야합니다. 수동으로

  • (명시 적으로 폐기 호출하여)
  • 자동 : 같은 폼, 패널, TabPage 또는 UserControl을 같은 .NET 컨테이너에 객체를 추가하여 이런 두 가지 방법이 있습니다. 컨테이너는 처분 될 때 모든 멤버를 보장합니다. 물론, 컨테이너 자체는 폐기되어야합니다 (또는 차례로 다른 컨테이너의 일부가되어야 함). Windows Forms 컨트롤의 경우 거의 항상 컨테이너에 컨테이너를 추가하므로 자동 폐기가 필요합니다. 여기에 다른 대답의
1

부지 .. 난 강력하게 읽고 조언

Garbage Collector Basics and Performance Hints 당신은 당신이했습니다 경우이 옵션 다음 ressource이 해제 될 수 있도록

  • 는 수동의 ImageList를 폐기 빨리 (단시간에)
  • 아무 것도하지 마십시오. 자원은 다음 번에 Garbage 수집을 분석하여 양식을 생성합니다. 양식이 이고 양식에 대한 참조를 유지하는 것이 없으면 양식 이 삭제 될 것이며 참조가 더 이상 ImageList를 가리키지 않으므로 ImageList가 삭제됩니다. 리소스 이 배포되지만 첫 번째 경우보다 약간 늦게 출시됩니다. 당신이 (당신이 만드는 경우 또는/양식 시대의 백을 닫습니다) 당신의 ImageList에서 큰 이미지 만있는 경우를 제외하고

, 당신은 코드에 기초 2가지 경우

+0

GC는 내가 물어 본 것과 아무런 관련이 없습니다. 어떤 클래스가 네이티브 리소스 (ImageList가 보유 할 수있는, 확실하지는 않음)를 나타내거나 보유 할 때 적절히 처리해야합니다. GC는 객체 루트 (아직 액세스 할 수있는 객체)를 찾고 더 이상 액세스 할 수없는 객체를 수집합니다. 이것은 이러한 개체가 "폐기 됨"(보유한 리소스가 올바르게 해제됨을 의미 함)을 의미하지 않습니다. 제 질문은 특히 WinForms에 관한 것이었고, 폼 자체에 의해 어떻게 든 자동으로 객체를 처리 할 수 ​​있는지에 대한 질문이었습니다. –

+0

GC는 개체의 Finalize 메서드를 호출하고 개발자는 Dispose 메서드를 호출합니다. 둘 다 GC를 통해 수행되는 리소스를 해제하는 것과 관련이 있습니다. 그래, 네 질문은 GC와 관련이있다. ImageList가 네이티브 리소스를 처리하는 경우 Finalize 메서드를 구현하여 릴리스하는 것이 그의 임무입니다 (ImageList가 Component에서 상속되기 때문에 그 경우입니다). 개발자는 dispose 메서드를 호출하여이를 가속화 할 수 있지만 그렇게하지 않으면 메모리 누수가 발생하지 않습니다. – Fabske

0

의 차이를 느끼지 못할 것입니다 이 컨트롤을 구현하기 위해 Designer를 사용하고 있지 않습니다. 따라서 디자이너가 제공 한 Dispose(bool disposing) 메서드 나 추가 컨트롤을 추가 할 수있는 System.CompononetModel.IContainer components 멤버가 없을 것입니다.ListBox가 Controls 속성을 처리하는 방법을 잘 모르겠지만 ImageList 인스턴스를 Controls.Add(ImageList)에 등록하면 자동으로 Dispose() 동작을 얻게됩니다.

귀하의 다른 옵션은 다음과 같은 Control.Dispose(bool)을 무시하는 것입니다

protected override void Dispose(bool disposing) 
{ 
    // Only call Dispose() on members if invoked through a direct 
    // call to `Dispose()`. (If disposing is false, that means 
    // we are invoked through the finalizer and we should *only* 
    // free up unmanaged resources that we *directly* own). 
    if (disposing) 
    { 
     ImageList.Dispose(); 
    } 

    base.Dispose(disposing); 
}