Почему System.Drawing.Drawing2D.Matrix является производным от MarshalByRefObject?

Почему Matrix тяжелый класс, полученный из MarshalByRefObject вместо легкой структуры?

3 ответа

Решение

Matrix На самом деле класс является оберткой для неуправляемой структуры, которой манипулирует GDI + Flat API.

Тем не менее, это характерно для классов вSystem.Drawing пространство имен, производное от MarshalByRefObject класс для удобства IDisposable реализации, а также получить автоматический маршалинг через границу домена приложения при использовании в Remoting.

Скорее всего, это было сделано потому, что большинство функций GDI (на которые опирается большинство API-интерфейсов, на которые опираются элементы управления Windows Forms) будут использовать матрицу GDI для преобразований; использование облегченной полностью управляемой структуры кода потребует перевода этой структуры через управляемую / неуправляемую границу каждый раз, когда вызывается метод.

По сравнению с затратами на маршалинг только вызова и дескриптора по сравнению с вызовом и всей структурой всякий раз, когда вы хотите выполнить операции с матрицей, было, вероятно, решено, что по соображениям производительности лучше маршалировать вызовы.

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

GDI + по своей сути является нативным API. Соответствующий заголовок для программ на C++ <gdiplus.h>вы найдете его в каталоге включения Windows SDK. Статья MSDN Library для родного класса Matrix находится здесь.

Согласно документации MSDN для метода:

Вызов Dispose позволяет перераспределять ресурсы, используемые этим объектом Matrix, для других целей.

Быстрый просмотр отражателя показывает этот код:

private void Dispose(bool disposing)
{
  if (!(this.nativeMatrix != IntPtr.Zero))
    return;
  SafeNativeMethods.Gdip.GdipDeleteMatrix(new HandleRef((object) this, this.nativeMatrix));
  this.nativeMatrix = IntPtr.Zero;
}
Другие вопросы по тегам