0

軽量構造体ではなくMatrix、重量クラスが派生するのはなぜですか?MarshalByRefObject

4

3 に答える 3

3

このMatrixクラスは、実際にはGDI+ Flat APIによって操作されるアンマネージ構造へのラッパーです。

System.Drawingとはいえ、名前空間内のクラスは、実装の利便性のためにMarshalByRefObjectクラスから派生し、Remoting で使用するときにアプリケーション ドメインの境界を越えて自動マーシャリングを取得するのが一般的です。IDisposable

これは、ほとんどのGDI 関数(Windows フォーム コントロールが依存するほとんどの API) が変換に GDI マトリックスを使用するためです。軽量のフル マネージド コード構造を使用すると、メソッドが呼び出されるたびにマネージド/アンマネージド境界を越えてその構造を変換する必要があります。

呼び出しとハンドルだけをマーシャリングするコストと、マトリックスで操作を実行するたびに呼び出しと構造全体をマーシャリングするコストを比較すると、パフォーマンス上の理由から、呼び出しをマーシャリングする方がよいと判断された可能性があります。

于 2012-10-08T16:56:32.857 に答える
1

通常の理由で、これは管理されていないオブジェクトです。破棄するのを忘れた場合に備えて、ファイナライザーもあります。

GDI+ の中核はネイティブ API です。C++ プログラムの対応するヘッダーは<gdiplus.h>です。これは、Windows SDK の include ディレクトリにあります。ネイティブ 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 に答える