Dispose


POINT using を利用して Dispose を自動で呼べる。 DESC C#では、オブジェクトが使われなくなったときにするべき処理は Dispose() に実装するのが一般的。 IDisposable インタフェースが Dispose() メソッドを持っています。 Dispose() を実装するクラスは、IDisposable を継承すること。 C# では何らかの終了処理が必要な場合は、以下のようにする必要がある。
class MyClass : IDisposable { public MyClass() { } public void Dispose() { // 終了処理 } } Dispose() の呼び出し例 public void AnyMethod() { MyClass obj = new MyClass(); obj.DoSomething1(); obj.DoSomething2(); obj.Dispose(); }
* クラスの設計者は、IDisposableを継承して Dispose() で終了処理を実装 * クラスの使用者は、クラスのオブジェクトを使用しなくなったら Dispose() を[ 明示的 ]に呼ぶ IDisposable を継承せずに Dispose() を実装しても良い? 望ましくありません。 スコープを抜けたときに Dispose() を自動で呼び出してくれる using が機能しなくなります。 using を積極的に使うことで Dispose() 忘れを防ぐことができるので、 IDisposableを継承してDispose()を実装すべき。 C++に馴染んできた人は、 C++のようにデストラクタがスコープ抜けたら自動で呼ばれる方がいいと思う。 ただそれはオブジェクトがローカル変数の場合。 void AnyMethod() { MyClass obj(); obj.DoSomething1(); obj.DoSomething2(); } これは AnyMethod() を抜けたら自動で obj のデストラクタは呼ばれます。 void AnyMethod() { MyClass* obj = new MyClass(); obj->DoSomething1(); obj->DoSomething2(); delete obj; } このように new を使ってオブジェクトを生成したら、 C#のDispose()同様にdeleteを最後に呼ぶ必要があります。 POINT C#の場合、クラスからオブジェクトの生成をする場合は、常にnewを使う。 ただし delete は呼ぶ必要はない。 deleteに相当する処理はGCが適当なタイミングでやってくれるから。 POINT C#で Dispose() を呼ばなければならないケースより、 C++で delete を呼び出さなければならないケースの方が多いはず。 また C# には、usingを使って Dispose() 自動呼び出しもできる。 C++より解放忘れのリスクは少ない。