2017-02-16 1 views
0

아래 주어진 시나리오에서 수동 비트 맵 처리 작업이 필요한지 궁금합니다. WinForm, A 및 B에 대해 두 개의 비트 맵을 전역으로 사용한다고 가정 해 보겠습니다. 각각의 이미지에서 일부 변형/혼합 작업을 수행하려고하지만 사본에서 그렇게 할 수 있습니다. 나는이 유사하게 변환 기능 (Bitmap Transform(Bitmap first, Bitmap second))를 호출하는 것을 목표로 : 나는 변환 내 AB 사본의C# manual-Dispose -of -an -IDisposable 의미 :

var newB = Transform((Bitmap)A.Clone(), (Bitmap)B.Clone()). 

Transform에서 수행, 처리합니까? 호출 전에 복사 한 다음 반환 후 처리합니까? Transform 반품 이후에 이러한 참조가 절대적으로 없어 지므로 GC를 신뢰할 수 있습니까? 잠재적 중복에 관해서는

BELOW_-

로부터 COMMENT 추가

-EDIT_, 나는 해당 게시물을보고 있지만, 호출시에 생성 된 인수를 사용의 예를 부족했다. 전달 된 객체가 호출 범위에 집이 없는지, 처분 할 수있는 방법이 있는지, 처분이 필요한지 또는 처분을 적절히 처리하기 위해 가정을 제공해야하는지 알고 싶었습니다. 그것은 일종의 처분 할 능력이없는 일회용 물체를 창작 범위에 버리는 것이 내가 모은 것에서는 권장하지 않는 것처럼 보인다. -

또한 마틴의 솔루션이 효과적이라는 것을 확인할 수 있습니다. 변형체에서 복제물을 만드는 것이 가장 체계적이고 깨끗한 것으로 입증되었습니다. 반환 할 때 참조 된 객체로 하나를 사용 했으므로 복제본 중 하나만 삭제해야했습니다. 마지막으로 복제본이 필요했습니다. 이미지 상자가 이미지를 읽을 비트 록에있는 경우 이미지 상자에 이미지가있는 경우 예외가 발생합니다. 도움이 필요하면 축사가 필요합니다.

+0

가능한 복제 [다른 객체로 전달하는 경우는 IDisposable 개체에 대한 폐기를 호출해야합니다 누구?] (http://stackoverflow.com/questions/4085939/who-should-call-dispose-on-idisposable-objects -when-passed-into-another-object) – dlatikay

+0

이러한 비트 맵이 프로세스에서 어떻게 손상 될 수 있는지는 명확하지 않습니다. Clone()은 그것을 막지 못합니다. 그러나 일반적으로, 예, 복제()하면 복제를 처분해야합니다. 또는 A와 B를 처리 할 때 누출됩니다. 게시 된 코드가 Transform()에 Dispose()를 호출하는 것은 중대한 실수이므로 객체의 소유자가 누구인지 항상 분명해야합니다. 정말로 * 정말로 * Clone()을 호출해야한다면, 아무것도하지 않으므로 반드시 Transform() 내부에서 수행해야합니다. 그리고 * using * 문을 사용합니다. –

+0

클론 동기를 신속하게 내 보냈 으면 불필요하다는 것을 확인할 수 있습니까? A 및 B 비트 맵이 활성 PictureBox에 의해 표시되고 있습니다. Transform에서 비트 맵을 비트 맵하려면 비트 맵을 변경하거나 변경하지 말고 PictureBox 참조를 무효화하거나 변형 된 내용이 변경되면 그림 상자 이미지를 변경하십시오. 이런 경우에는 새로 고침을 일시 중단 하시겠습니까? 나는 단단히 묶인 윈도우 폼 객체가 영속적 인 GUI를 위해 사용하고있는 어떤 변수에 있는지 잘 모르겠다. – schulmaster

답변

0

가비지 수집기는 구현 객체에 대해 Dispose을 자동으로 호출하지 않습니다. IDisposable. 이것은 클래스가 파이널 라이저를 오버라이드 (override) 해, Dispose가 불려 갔을 때에 만 생깁니다. documentation here을 참조하십시오.

일반적으로 가장 좋은 방법은 using 블록에 일회용 개체의 인스턴스를 만드는 것입니다.

using (var bitmapA = (Bitmap)A.Clone()) 
using (var bitmapB = (Bitmap)B.Clone()) 
{ 
    var newB = Transform(bitmapA, bitmapB); 
} 
+0

이것은 성공적으로 내 질문에 대답했지만, 많은 나쁜 행동으로 이어질 수있는 질문을하고있었습니다. 여전히 받아 들일 것입니다. – schulmaster