使用块使用块
可能重复:
如果我不在我的C#控制台应用程序中关闭System.Diagnostics.Process会发生什么?
由于System.Diagnostics.Process
inheritance自实现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语句简化了这一点。