0

为什么从轻量级结构Matrix派生出重量级类?MarshalByRefObject

4

3 回答 3

3

该类实际上是由GDI+ Flat API操作的非托管结构Matrix包装器。

也就是说,System.Drawing命名空间中的类通常从MarshalByRefObject派生以方便IDisposable实现,并在 Remoting 中使用时跨应用程序域边界进行自动编组。

这很有可能是因为大多数GDI 函数(Windows 窗体控件所依赖的大多数 API)将使用 GDI 矩阵进行转换;使用轻量级、完全托管的代码结构将需要在每次调用方法时跨托管/非托管边界转换该结构。

与仅对调用和句柄进行编组的成本相比,与每当您想对矩阵进行操作时调用和整个结构的成本相比,出于性能原因,可能决定对调用进行编组更好。

于 2012-10-08T16:56:32.857 回答
1

由于通常的原因,它是一个非托管对象。它也有一个终结器,以防你忘记处理。

GDI+ 的核心是原生 api。C++ 程序的相应头文件是<gdiplus.h>,您可以在 Windows SDK 包含目录中找到它。本机 Matrix 类的 MSDN 库文章在此处

于 2012-10-08T16:59:15.057 回答
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;
}
于 2012-10-08T16:50:32.607 回答