使用块使用块

可能重复:
如果我不在我的C#控制台应用程序中关闭System.Diagnostics.Process会发生什么?

由于System.Diagnostics.Processinheritance自实现IDisposable Component ,我是否应该始终using块创建Process

例如,这……:

 using (var process = new Process()) { process.StartInfo.FileName = "some process.exe"; process.Start(); process.WaitForExit(); } 

……而不是这个:

 var process = new Process { StartInfo = { FileName = "some process.exe" } }; process.Start(); process.WaitForExit(); 

我问,因为我很少看到Process出现在using块中; 例如, Process的MSDN页面不使用它。 使用对象初始化程序也很有帮助。

如果我应该使用它,那么我应该去“改造”它到我现有的代码库吗?

如果没有这样做会有什么后果? (假设在每种情况下都正确调用WaitForExit() 。)

如果您不使用或不能使用using(),则应确保在不再需要时处理流程变量。

如果在类(而不是程序或方法)中使用流程变量,那么该类应该实现IDisposable,然后在其Dispose(bool)方法中调用_process.Dispose:

 void Dispose(bool disposing) { ... if (_process != null) { Dispose(_process); } } 

如果没有_process字段但只有您在方法中使用的过程变量,则必须在方法内部处理它:

 void MyMethod() { var process = ... ... use it here ... process.Dispose(); } 

MSDN的例子是人为的。 打开进程句柄的程序在启动进程后立即退出。 当该程序退出时,它打开的任何句柄都将关闭。

如果打开进程句柄,则应将其关闭。 Component.Dispose的Process.Dispose重写只调用Process.Close。 using语句简化了这一点。