为什么Matrix
是从MarshalByRefObject
派生的重量级类,而不是轻量级结构?
发布于 2012-10-09 00:56:33
Matrix
class实际上是由GDI+ Flat API操作的非托管结构的包装。
也就是说,System.Drawing
namespace中的类通常是从MarshalByRefObject
class派生的,以方便IDisposable
implementation,并在远程处理中使用时跨应用程序域边界进行自动封送处理。
这很可能是因为大多数GDI functions ( Windows窗体控件所依赖的大多数API)将使用GDI矩阵进行转换;使用轻量级的、完全托管的代码结构将需要在每次调用方法时跨托管/非托管边界转换该结构。
与只封送调用和句柄的成本相比,无论何时您想要在矩阵上执行操作时都要封送调用和整个结构,因此可能决定出于性能原因,封送调用更好。
发布于 2012-10-09 00:59:15
由于通常的原因,它是一个非托管对象。它也有一个终结器,以防你忘记处理。
GDI+的核心是一个本机应用程序接口。C++程序的对应头文件是<gdiplus.h>
,您可以在Windows SDK include目录中找到它。有关本机矩阵类is here的MSDN Library文章。
发布于 2012-10-09 00:50:33
根据该方法的MSDN文档:
调用Dispose允许将此矩阵对象使用的资源重新分配给其他用途。
快速浏览反射器显示了以下代码:
private void Dispose(bool disposing)
{
if (!(this.nativeMatrix != IntPtr.Zero))
return;
SafeNativeMethods.Gdip.GdipDeleteMatrix(new HandleRef((object) this, this.nativeMatrix));
this.nativeMatrix = IntPtr.Zero;
}
https://stackoverflow.com/questions/12785924
复制相似问题