C#では、IDisposable
を実装する_class Process
_から_class Component
_を継承しているため、Process
オブジェクトでDispose()
を呼び出すことができます。私は本当にする必要がありますか?本当にする必要があるかどうかはどうすればわかりますか?
次のコードがあるとします。
_ var allProcesses = System.Diagnostics.Process.GetProcesses();
var processesNames = processes.Select( p => p.ProcessName );
// output process names here
_
Process
オブジェクトの配列があり、配列をトラバースする_try-finally
_と各オブジェクトのDispose()
を作成したようです。それは間違いなくたくさんの余分なコードです。
Process
オブジェクトに対してDispose()
は何をしますか?本当にすべてのProcess
オブジェクトをDispose()
する必要がありますか。また、そうする必要があるかどうかをどのように判断しますか?
本当にすべての
Process
オブジェクトをDispose()
する必要があるのでしょうか。
はい、処分してください。 Process
のドキュメントのこのテキストに注意してください:
システムプロセスは、プロセスIDによってシステム上で一意に識別されます。多くのWindowsリソースと同様に、プロセスもそのハンドルによって識別されますが、これはコンピューター上で一意ではない場合があります。ハンドルは、リソースの識別子の総称です。オペレーティングシステムは、プロセスが終了した場合でも、ProcessコンポーネントのHandleプロパティを通じてアクセスされるプロセスハンドルを保持します。したがって、ExitCode(通常、成功した場合はゼロまたはゼロ以外のエラーコード)やExitTimeなどのプロセスの管理情報を取得できます。ハンドルは非常に貴重なリソースであるため、ハンドルのリークはメモリのリークよりも危険です。
そのため、それらをDispose
しないと、ハンドルがリークする可能性があります(ガベージコレクションされるまで-しかし、Dispose
の目的は、リソースの早期クリーンアップを可能にすることです)
また、同じドキュメントがProcess
がDispose(bool)
をオーバーライドすることを示していることにも注意してください-実際に行う別の手がかりsomethingDispose
が呼び出されたとき。
mSDNから: http://msdn.Microsoft.com/en-us/library/3cc9y48w(v = vs.80).aspx
コンポーネントの使用が終了したら、Disposeを呼び出します。 Disposeメソッドは、コンポーネントを使用できない状態のままにします。 Disposeを呼び出した後、コンポーネントへのすべての参照を解放して、ガベージコレクターがコンポーネントが占有していたメモリを解放できるようにする必要があります。