'using'ステートメントによって自動的に破棄されるオブジェクトの例を見てきました。これは、オブジェクトのスコープを定義し、破棄を強制する決定的な方法です。
また、try / catch/finallyブロックのfinallyでdisposeが呼び出されるのを見ました。
ただし、使い捨てオブジェクトがフォームクラスのプロパティ初期化子としてインスタンス化されているとすると、そのシナリオでDisposeが呼び出されるようにするにはどうすればよいですか?
ニーズに応じて、このタスクを実行するためのさまざまな手法があります。MSDNから:
When a form is closed, all resources created within the object are closed and the form is disposed.
プロパティの有効期間がフォームに直接関連付けられている場合は、デザイナーファイルのオーバーライドされたDisposeメソッドでオブジェクトを破棄できます。したがって、を呼び出すform.Close()
と、Disposableオブジェクトも破棄されます。
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
myDisposableObject.Dispose();
base.Dispose(disposing);
}
デザイナファイルのこの特定の部分は上書きされないように安全ですが、開発者は自動生成されたコードを想定してデザイナファイルを見落とす可能性があります。フォームの破棄イベントにフックするなどの別の破棄手段は、ニーズにより適している場合があります。
あなたがこのようなことを意味するなら:
var form = new Form { Dependency = new DisposableDependency() };
次に、Form
クラスはそれを独自のDispose()
メソッドで破棄する必要があります。最善の方法は、独自のメソッドも実装するIDisposable
か、そのような使い捨ての依存関係がClose()
存在する場合はメソッドで破棄することです。
フォームにIDisposableを実装させ、Form.Dispose()のオブジェクトでDispose()メソッドを呼び出すだけです。
using(var myclass = new myclass()){}を使用するよりもIDisposableからクラスを継承するようにします。これがお役に立てば幸いです。