C#2008
私はこれにしばらく取り組んできましたが、コードでのfinalizeメソッドとdisposeメソッドの使用についてはまだ混乱しています。私の質問は以下の通りです:
管理されていないリソースを処分するときに必要なのはファイナライザーだけであることを私は知っています。ただし、管理されていないリソースを呼び出す管理されたリソースがある場合でも、ファイナライザーを実装する必要がありますか?
ただし、管理されていないリソースを直接または間接的に使用しないクラスを開発する場合、
IDisposable
そのクラスのクライアントが「usingステートメント」を使用できるようにを実装する必要がありますか?クラスのクライアントがusingステートメントを使用できるようにするためだけにIDisposableを実装することは可能でしょうか?
using(myClass objClass = new myClass()) { // Do stuff here }
Finalize / disposeの使用法を示すために、以下の簡単なコードを開発しました。
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