軽量構造体ではなくMatrix
、重量クラスが派生するのはなぜですか?MarshalByRefObject
3 に答える
このMatrix
クラスは、実際にはGDI+ Flat APIによって操作されるアンマネージ構造へのラッパーです。
System.Drawing
とはいえ、名前空間内のクラスは、実装の利便性のためにMarshalByRefObject
クラスから派生し、Remoting で使用するときにアプリケーション ドメインの境界を越えて自動マーシャリングを取得するのが一般的です。IDisposable
これは、ほとんどのGDI 関数(Windows フォーム コントロールが依存するほとんどの API) が変換に GDI マトリックスを使用するためです。軽量のフル マネージド コード構造を使用すると、メソッドが呼び出されるたびにマネージド/アンマネージド境界を越えてその構造を変換する必要があります。
呼び出しとハンドルだけをマーシャリングするコストと、マトリックスで操作を実行するたびに呼び出しと構造全体をマーシャリングするコストを比較すると、パフォーマンス上の理由から、呼び出しをマーシャリングする方がよいと判断された可能性があります。
通常の理由で、これは管理されていないオブジェクトです。破棄するのを忘れた場合に備えて、ファイナライザーもあります。
GDI+ の中核はネイティブ API です。C++ プログラムの対応するヘッダーは<gdiplus.h>
です。これは、Windows SDK の include ディレクトリにあります。ネイティブ Matrix クラスに関する MSDN ライブラリの記事は、こちらです。
メソッドの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;
}