首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么System.Drawing.Drawing2D.Matrix要从MarshalByRefObject派生?

为什么System.Drawing.Drawing2D.Matrix要从MarshalByRefObject派生?
EN

Stack Overflow用户
提问于 2012-10-09 00:46:10
回答 3查看 440关注 0票数 0

为什么Matrix是从MarshalByRefObject派生的重量级类,而不是轻量级结构?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-10-09 00:56:33

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

也就是说,System.Drawing namespace中的类通常是从MarshalByRefObject class派生的,以方便IDisposable implementation,并在远程处理中使用时跨应用程序域边界进行自动封送处理。

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

与只封送调用和句柄的成本相比,无论何时您想要在矩阵上执行操作时都要封送调用和整个结构,因此可能决定出于性能原因,封送调用更好。

票数 3
EN

Stack Overflow用户

发布于 2012-10-09 00:59:15

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

GDI+的核心是一个本机应用程序接口。C++程序的对应头文件是<gdiplus.h>,您可以在Windows SDK include目录中找到它。有关本机矩阵类is here的MSDN Library文章。

票数 1
EN

Stack Overflow用户

发布于 2012-10-09 00:50:33

根据该方法的MSDN文档:

调用Dispose允许将此矩阵对象使用的资源重新分配给其他用途。

快速浏览反射器显示了以下代码:

代码语言:javascript
运行
复制
private void Dispose(bool disposing)
{
  if (!(this.nativeMatrix != IntPtr.Zero))
    return;
  SafeNativeMethods.Gdip.GdipDeleteMatrix(new HandleRef((object) this, this.nativeMatrix));
  this.nativeMatrix = IntPtr.Zero;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12785924

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档