2011-07-01 10 views
3

異なる変換マトリックスを持つグラフィックスオブジェクトでプリミティブを描画する必要があります。私は行列やグラフィックは私のためにそれを行います処分する必要があるのだろうか:Graphics.Transformから返された行列を破棄する必要がありますか?

using (var g = Graphics.FromImage(...)) 
{ 
    ... some code ... 
    var tmp = g.Transform; 
    g.TranslateTransform(...); 
    ... some code ... 
    g.Transform = tmp; 
    // should I call tmp.Dispose() here? 
    tmp.Dispose(); 
    ... some code that use g .... 
} 

http://msdn.microsoft.com/en-us/library/system.drawing.graphics.transform.aspx

は言う:

行列が返され、transformプロパティによって がのコピーであるため、マトリックスの を不要にしたら処分する必要があります。

私はg.Transform = tmp;の後にそれを必要としません、私はそれを処分すべきですか?

答えて

2

、Graphics.Transformは...

この グラフィックスのための幾何学的 ワールド変換のコピーを取得または設定します。

(強調鉱山。)あなたはTransformを呼び出すと

、あなたはマトリックスのコピーを作っている、あなたはそれを自分で処分しなければなりません。あなたが所有している限り、IDisposable、好ましくはusing(...)の構文を実装するオブジェクトを処分することは、常に良い考えです。

+0

一般に、IDisposable *を実装するオブジェクトを処分するのは、それがあなたの責任であれば処分することだけです。この場合、私は考えておらず、あなたが正しいと思いますが、一般的にオブジェクトの所有権を認識する必要があります。あなたがどこかからストリームオブジェクトを取得した場合(例えば、Webリクエストや入出力ストリームを考える)、それらを破棄するのはあなたの責任ではないので、そうしないでください。 –

+0

Lasseが指摘しているように、オブジェクト(WSS/SharePointのSPContext.Currentから返されたオブジェクトなど)を破棄しないでください。だから必ずしも良い考えではありません。 –

+0

@Lasse、@トーマス - 両方に感謝、全く同感。私はそれをより明確にするために私の答えを更新しました。 – razlebe

0

私ははいと言います。 IDisposableを使用する理由は常にあります。そしてこの場合、マニュアルにもそのことが書かれています。 disposablesを扱うときには、 "using"構文を使用できることに注意してください。 MSDNを引用

0

IDisposableを実装している場合は、完了したら処分する必要があります(なぜ行列を処理する必要があるのか​​分かりませんが、問題はありません)。リフレクターてみる

+0

これは間違っています。たとえば、MemoryStreamはIDisposableを実装しますが、何も処理しないので、MemoryStreamインスタンスを破棄する必要はありません。それはストリームから継承するので、この方法です。 –

+0

@JosephLennox契約はあなたがそれを処分することです。 1)これはフレームワークの将来のバージョンで壊れる可能性があり、2)Disposeメソッドが何かをしているかどうかを判断するために使用しているすべての使い捨てタイプを調査するのはエラーがあり、面倒で面倒です。また、コンポーネントを更新すると、破損することがあります。 – erikkallen

+0

Btw、MemoryStreamを廃棄すると、 '' GC.SupressFinalize(this) '' 'が実行されます。 – erikkallen

2

私はMatrix構造体は、ネイティブ行列

public sealed class Matrix : MarshalByRefObject, IDisposable 
{ 
    // Fields 
    internal IntPtr nativeMatrix; 
... 

への参照を持っており、Disposed()

private void Dispose(bool disposing) 
{ 
    if (this.nativeMatrix != IntPtr.Zero) 
    { 
     SafeNativeMethods.Gdip.GdipDeleteMatrix(new HandleRef(this, this.nativeMatrix)); 
     this.nativeMatrix = IntPtr.Zero; 
    } 
} 

呼び出されたときにそう答えは明確イエスだろうと見ます。

関連する問題