2011-07-01 4 views
3

다른 변형 행렬이있는 그래픽 객체가있는 프리미티브를 그릴 필요가 있습니다. 나는 행렬을 폐기해야 궁금해 또는 그래픽 나를 위해 그것을 할 것입니다 :Graphics.Transform에서 반환 한 행렬을 처리해야합니까?

using (var g = Graphics.FromImage(...)) 
{ 
    ... some code ... 
    var tmp = g.Transform; 
    g.TranslateTransform(...); 
    ... some code ... 
    g.Transform = tmp; 
    // should I call tmp.Dispose() here? 
    tmp.Dispose(); 
    ... some code that use g .... 
} 

http://msdn.microsoft.com/en-us/library/system.drawing.graphics.transform.aspx

는 말한다 :

행렬을 반환하기 때문에 변형에 의해 재산 은의 복사본입니다 기하학적 변환을 사용하면 더 이상 필요하지 않을 때 행렬의 을 처분해야합니다.

g.Transform = tmp; 이후에는 필요하지 않습니다. 처리해야합니까?

답변

2

...

가져이 그래픽 기하학적 세계 변환 사본를 설정한다.

(강조 광산.)

당신이 Transform 전화

, 당신은 매트릭스의 사본을 만들고 있어요, 당신은 스스로를 폐기해야한다. 자신이 소유하고있는 한, IDisposable을 구현하는 객체를 처리하고, 바람직하게는 using(...) 구문을 사용하여 객체를 처리하는 것이 좋습니다.

+0

일반적으로 'IDisposable' *을 구현하는 객체를 처리하는 것은 사용자의 책임이므로 * 처리하는 것이 좋습니다. 이 경우 나는 잘 모르고 당신이 옳다고 생각하지만 일반적으로 객체의 소유권을 알아야합니다. 어딘가에서 스트림 객체를 얻는다면 (예를 들어 웹 요청과 입출력 스트림을 생각해보십시오), 그 객체를 처리하는 것은 사용자의 책임이 아니므로 안됩니다. –

+0

Lasse가 지적했듯이 WSS/SharePoint에서 SPContext.Current에서 반환 된 개체와 같이 개체를 처리하면 안되는 경우가 있습니다. 항상 좋은 생각은 아닙니다. –

+0

@Lasse, @ 토마스 - 둘 다 감사합니다, 완전히 동의합니다. 더 명확하게하기 위해 내 대답을 업데이트했습니다. – razlebe

0

나는 그렇다고 대답 할 것입니다. 항상 IDisposable을 사용하는 이유가 있습니다. 그리고이 경우에는 설명서에 나와 있습니다. 일회용품을 다룰 때 "사용"구문을 사용할 수 있습니다. MSDN, Graphics.Transform을 인용

0

IDisposable을 구현하는 경우 완료되면 처리해야합니다 (매트릭스를 삭제해야하는 이유는 알 수 없지만 상관 없습니다).

+0

올바르지 않습니다. 예를 들어 MemoryStream은 IDisposable을 구현하지만 아무 것도 처리하지 않으므로 MemoryStream 인스턴스를 삭제할 필요가 없습니다. 스트림에서 상속되기 때문에이 방법입니다. –

+0

@JosephLennox 계약은 당신이 처분해야한다는 것입니다. 어쩌면 그것없이 도망 갈 수는 있지만, 1) 프레임 워크의 차기 버전에서 깨질 수 있으며, 2) Dispose 메서드가 무언가를하는지 판단하기 위해 사용하는 모든 일회용 유형을 조사하는 것이 오류가 발생하기 쉽고 지루합니다. 그리고 구성 요소를 업데이트하면 중단 될 수 있습니다. – erikkallen

+0

Btw, MemoryStream을 삭제하면 GC.SupressFinalize (this)'''가 수행됩니다. – erikkallen

2

은 리플렉터를 통해 찾고 난 Matrix 구조체는 기본 매트릭스

public sealed class Matrix : MarshalByRefObject, IDisposable 
{ 
    // Fields 
    internal IntPtr nativeMatrix; 
... 

Disposed()

private void Dispose(bool disposing) 
{ 
    if (this.nativeMatrix != IntPtr.Zero) 
    { 
     SafeNativeMethods.Gdip.GdipDeleteMatrix(new HandleRef(this, this.nativeMatrix)); 
     this.nativeMatrix = IntPtr.Zero; 
    } 
} 

를 호출 할 때 그래서 대답은 명확한 예 것에 대한 참조를 가지고 참조하십시오.

관련 문제