我应该处理()Graphics.Transform返回的Matrix吗?

时间:2011-07-01 15:52:47

标签: c# graphics

我需要使用具有不同变换矩阵的图形对象绘制图元。我想知道我应该处理矩阵或图形会为我做这件事:

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

表示:

  

因为返回的矩阵和Transform属性   是几何变换的副本,你应该处理   当你不再需要矩阵的时候。

g.Transform = tmp;之后我不需要它,我应该处理它吗?

4 个答案:

答案 0 :(得分:2)

引用MSDN,Graphics.Transform ...

  

获取或设置几何的副本   世界的变革   图形。

(强调我的。)

当你致电Transform时,你正在复制Matrix,你应该自己处理它。只要您拥有它们,最好配置实现IDisposable的对象,最好使用using(...)语法。

答案 1 :(得分:2)

浏览Reflector我看到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;
    }
}

所以答案肯定是肯定的。

答案 2 :(得分:0)

我会说是的。使用IDisposable总是有原因的。在这种情况下,手册也说了。 请记住,在处理一次性用品时,您可以使用“使用”语法。

答案 3 :(得分:0)

如果它实现了IDisposable,你必须在完成后处理它(我不明白为什么需要处理矩阵,但这无关紧要。)