2017-04-08 19 views
0

私は少し問題実装IDisposableをC#

私はゲームエンジンを開発していますし、私の解決策にコード分析を実行しているし、私の「GrapicsEngine」クラスにIDisposableインターフェイスを実装するように言われてIDisposableをインターフェイスを理解することを抱えていますBitmapインスタンスが含まれているためです。

は当然のことながら、私はこれを正しく行う方法を学ぶためにインターネットを検索し、次のコードを思い付いています。ここ

は私のクラスのメンバーである:

private const int BITMAP_WIDTH = 4096; 
private const int BITMAP_HEIGHT = 4096; 

private Graphics backBuffer; 
private Bitmap bitmap; 

private Color clearColor; 

private WindowSurface surface; 

private GraphicsQuality quality; 

private Viewport viewport; 

、ここでは私のIDispoable領域は次のとおりです。

#region IDisposable 

public void Dispose() 
{ 
    Dispose(true); 
    GC.SuppressFinalize(this); 
} 

protected virtual void Dispose(bool disposing) 
{ 
    if (disposing == true) 
     ReleaseManagedResources(); 

    ReleaseUnmanagedResources(); 
} 

private void ReleaseManagedResources() 
{ 
    if (bitmap != null) 
     bitmap.Dispose(); 
    if (backBuffer != null) 
     backBuffer.Dispose(); 
} 

private void ReleaseUnmanagedResources() 
{ 

} 

~GraphicsEngine() 
{ 
    Dispose(false); 
} 

#endregion 

WindowSurfaceはWinFormパネルであり、GraphicsQualityは列挙型であり、Viewportにはint値しか含まれていないことに注意してください。

だから、僕はカップルの質問がある:

  1. 私はきちんと自分の資源を廃棄するだろうか?
  2. アンマネージドリソースメソッドで処理するリソース
  3. 新しいクラスを作成し、そのクラスに私のGraphicsEngineクラスが含まれている場合、そのクラスもIDisposableを実装する必要がありますか?

このトピックに関するお手伝いをいただければ幸いです。

答えて

3

あなたは正しい軌道に乗っています。ディスポーザブルであるクラスレベルの変数を持っているときはいつでも、包含するクラスも使い捨てでなければなりません。そして、あなたは私が言うことからそれを正しく扱っています。クラス名の行は表示されないので、IDisposableインターフェイスが含まれているかどうかはわかりませんが、メソッドを実装してからは想像しています。追加しない場合は、追加してください。
IDisposableは連鎖反応タイプの実装です。変数が使い捨てで、それがメソッド呼び出しのローカルのみであれば、呼び出しの最後にその変数を破棄しますが、クラスレベルにある場合は、IDisposableを実装してクラスの中に処理します。そうすれば、あなたのクラスを使っている人は誰でもそれを適切に処分できます。ですから、例えば

は:

public class MyClass 
{ 
    private File txtFile = File.Create(...) 
} 

は今、誰かが私のクラスを使用しています...私は私のクラスで開いたファイルを持っていると言います。

private void useClass() 
{ 
    var myClass = new MyClass(); 
} 

さて、ファイルを開いたばかりで、正しく処理されませんでした。

は、コードを変更し、それはとても...

public class MyClass : IDisposable 
{ 
    private File txtFile = new File.Create(...) 

    public void Dispose() 
    { 
      txtFile.Dispose(); 
    } 
} 

とするとき、それは彼らがそうのようにそれを使用することができます使用は...

private void useClass() 
{ 
    using (var myClass = new MyClass()) 
    { 
     //some code 
    } 
} 

うまくいけば、これは、あなたの質問に答えるように使用することができます。ちょうど覚えておきますが、メソッドにローカルな使い捨てのオブジェクトを宣言していれば、あなたはそのメソッドにそれを処分するので、クラスにIDisposableを実装する必要はありません。しかし、クラスレベルのスコープで実装する場合、メソッドを処理するかどうかにかかわらず、IDisposableを実装し、クラス呼び出しが含まれているときに破棄されることを確認する必要があります。理にかなっている? これが役立つことを願っています。

+0

私は今理解していると思います。ただ1つの最後の質問:Spriteクラスがあります。このクラスには、getterとsetterを持つビットマップが含まれています。これはIDisposableを実装する必要がありますか、必要なときには "sprite.bitmap.Dispose"私は後者のイメージです。 –

+0

コードの部分を掲示しておきます。使い捨てオブジェクトをプロパティ(getter/setter)に戻すと、オブジェクト自体は使い捨てであり、そのプロパティを使用するすべてのユーザーは、使い捨て機能とともに使用することもできます。しかし、再び、はい、それはクラスレベルにあるので、それをあなたのクラスに実装して処分したいと思っています。 –

+0

私は今理解していると思う。最後の質問の1つに、アニメーション用のフレームのリストがあり、フレームにビットマップが含まれています。フレームを廃棄するとき(リストを反復することによって)、管理されていないリソースを処分することになると、これは私のリストをクリアすべき場所になりますか? –

関連する問題