2013-07-14 3 views
3

ImageList는 삽입 된 모든 이미지의 복사본을 만들어야합니다. 따라서 원본을 목록에 추가 한 후 처분하는 것이 안전해야합니다.ImageList : 원본 이미지를 삭제하면 목록에서 제거됩니다.

왜 다음 테스트 케이스가 실패합니까? 여기에 일어날 것으로 보인다 무엇

Bitmap test = new Bitmap(128, 128); 
ImageList il = new ImageList(); 

il.Images.Add(test); 
Assert.AreEqual(1, il.Images.Count); // OK, image has been inserted 
test.Dispose(); // now let's dispose the original 
try 
{ 
    var retrievalTest = il.Images[0]; 
} 
catch (ArgumentException) // ... but this Exception happens! 
{ 
} 

Assert.AreEqual(1, il.Images.Count); // and this will fail 

은 이것이다 : 이미지를 검색하려고 할 때의 ImageList 원래 배치 된 것을 발견하고의 ImageList에서 제거합니다.

왜 그런 일이 일어 났을 까, 나는 ImageList가 이미지의 복사본을 만들 것이라고 생각 했는가?

답변

5

예, ImageList는 비트 맵의 ​​복사본을 만듭니다. 그러나 테스트 코드는 .NET 프레임 워크에서 흔히 볼 수있는 유명한 초기화 패턴과 충돌합니다. 문제가되는 것은 일 때이 사본을 생성합니다. 그것이해야 할 때만 않습니다.

il.Images.Add(test); 
var dummy = il.Handle;  // <== NOTE: added 
test.Dispose();   // no problem 

을 그리고 당신은 폐기하는 것은 더 이상 문제가 있음을 볼 수 있습니다 : 그 서둘러 코드에서 작은 변화를 확인합니다.

여기에 적절한 조언을하는 방법을 모르겠 으면 코드가 너무 복잡합니다. 이것은 일반적으로 잘 작동하며 ImageList는 소비자가 비트 맵, Treeview 또는 ListView를 사용하기 시작할 때 사본을 만듭니다. 일반적으로 ImageList를 콜렉션 객체로 사용하지 마십시오. ImageList를 콜렉션 객체로 사용하지 마십시오. 모델과 뷰를 분리하면 문제가되지 않습니다.

1

ImageList는 에 삽입되는 모든 이미지의 복사본을 만들어야합니다.

설명서에 표시되지 않은 내용이 있습니다. 그래서 간단한 대답은 여러분의 가정이 잘못되었다는 것입니다.

+0

MSDN의 문서는 불행히도이 질문에 실제로 대답하기에 충분하지 않습니다. ['ImageList' *는'Dispose'를 덮어 씁니다.] (https://referencesource.microsoft.com/#System.Windows.Forms/winforms/Managed/System/WinForms/ImageList.cs,587)와 ['ImageList '때때로 이미지 복사본을 만듭니다.] (https://referencesource.microsoft.com/#System.Windows.Forms/winforms/Managed/System/WinForms/ImageList.cs,513),'Dispose'처럼 보입니다. 'ImageList' 자체가 만들고 유지 보수 한 이미지의 복사본과'Control '을'Dispose'한 후 이미지를 복사합니다. – jrh