C#2008
私はしばらくこれに取り組んできましたが、コード内のfinalizeメソッドとdisposeメソッドの使用についてはまだ混乱しています。私の質問は以下の通りです:
アンマネージリソースを破棄するときは、ファイナライザーのみが必要であることを知っています。ただし、アンマネージリソースを呼び出すマネージリソースがある場合でも、ファイナライザを実装する必要がありますか?
ただし、アンマネージリソースを使用しないクラスを開発する場合-直接的または間接的に、
IDisposable
そのクラスのクライアントが「usingステートメント」を使用できるように実装する必要がありますか?クラスのクライアントがusingステートメントを使用できるようにするためだけにIDisposableを実装することは可能でしょうか?
using(myClass objClass = new myClass()) { // Do stuff here }
以下のシンプルなコードを開発して、ファイナライズ/破棄の使用方法を示します。
public class NoGateway : IDisposable { private WebClient wc = null; public NoGateway() { wc = new WebClient(); wc.DownloadStringCompleted += wc_DownloadStringCompleted; } // Start the Async call to find if NoGateway is true or false public void NoGatewayStatus() { // Start the Async's download // Do other work here wc.DownloadStringAsync(new Uri(www.xxxx.xxx)); } private void wc_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e) { // Do work here } // Dispose of the NoGateway object public void Dispose() { wc.DownloadStringCompleted -= wc_DownloadStringCompleted; wc.Dispose(); GC.SuppressFinalize(this); } }
ソースコードに関する質問:
ここではファイナライザを追加していません。通常、ファイナライザはGCによって呼び出され、ファイナライザはDisposeを呼び出します。ファイナライザがないので、Disposeメソッドを呼び出すのはいつですか?それを呼び出さなければならないのはクラスのクライアントですか?
したがって、例の私のクラスはNoGatewayと呼ばれ、クライアントは次のようにクラスを使用および破棄できます。
using(NoGateway objNoGateway = new NoGateway()) { // Do stuff here }
実行がusingブロックの最後に達したときにDisposeメソッドが自動的に呼び出されますか、それともクライアントが手動でdisposeメソッドを呼び出さなければなりませんか?すなわち
NoGateway objNoGateway = new NoGateway(); // Do stuff with object objNoGateway.Dispose(); // finished with it
WebClient
クラスでクラスを使用していNoGateway
ます。WebClient
はIDisposable
インターフェースを実装しているので、WebClient
管理されていないリソースを間接的に使用するということですか?これに従うための厳格なルールはありますか?クラスがアンマネージリソースを使用していることをどのようにして知ることができますか?