Должен ли я распоряжаться () Матрица, возвращенная Graphics.Transform? - PullRequest
3 голосов
/ 01 июля 2011

Мне нужно нарисовать примитивы с графическим объектом с другой матрицей преобразования.Интересно, должен ли я распоряжаться матрицей или графика сделает это за меня:

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 ]

2 голосов
/ 01 июля 2011

Просматривая 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 голосов
/ 01 июля 2011

Цитирование MSDN , Graphics.Transform ...

Получает или задает копию геометрического мировая трансформация для этого Графика.

(выделено мое.)

Когда вы звоните Transform, вы делаете копию Матрицы, и вы должны утилизировать ее самостоятельно. Пока вы им владеете, всегда полезно располагать объекты, которые реализуют IDisposable, и предпочтительно использовать синтаксис using(...).

0 голосов
/ 01 июля 2011

Если он реализует IDisposable, вы должны избавиться от него, когда вы закончите (я не понимаю, почему матрица должна быть удалена, но это не имеет значения).

0 голосов
/ 01 июля 2011

Я бы сказал, да. Всегда есть причина для использования IDisposable. И в этом случае, руководство также говорит это. Помните, что при работе с одноразовыми товарами вы можете использовать синтаксис «using».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...