为什么Matrix
是一个来自MarshalByRefObject
而不是轻量级结构的重量级类?
答案 0 :(得分:3)
Matrix
class实际上是由GDI+ Flat API操纵的非托管结构的包装器。
尽管如此,System.Drawing
namespace中的类通常MarshalByRefObject
class派生IDisposable
implementation以方便GDI functions,并且在使用时自动封送应用程序域边界在Remoting。
这很可能是因为大多数{{3}}(Windows窗体控件所依赖的大多数API)将使用GDI矩阵进行转换;使用轻量级,完全托管的代码结构,每次调用方法时都需要在托管/非托管边界上转换该结构。
与只调用调用和句柄的成本相比,只要你想对矩阵进行操作,就调用和整个结构,可能由于性能原因而决定最好整理调用。< / p>
答案 1 :(得分:1)
由于通常的原因,它是一个非托管对象。它也有一个终结器,以防您忘记丢弃。
GDI +的核心是原生api。 C ++程序的相应标题是<gdiplus.h>
,您可以在Windows SDK包含目录中找到它。本机Matrix类is here的MSDN Library文章。
答案 2 :(得分:0)
根据该方法的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;
}