Почему 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;
}