C# 使用块使用进程

C# 使用块使用进程,c#,process,coding-style,idisposable,using-statement,C#,Process,Coding Style,Idisposable,Using Statement,可能重复: 作为System.Diagnostics.Process继承自实现IDisposable的组件,我是否应该始终使用块创建一个流程 例如,这个…: using (var process = new Process()) { process.StartInfo.FileName = "some process.exe"; process.Start(); process.WaitForExit(); } …而不是这个: var process = new Pr

可能重复:

作为
System.Diagnostics.Process
继承自实现
IDisposable
组件
,我是否应该始终使用
块创建一个
流程

例如,这个…:

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();

我这样问是因为我很少看到
进程
出现在
使用
块中;例如,for
进程
不使用它。使用对象初始值设定项也很有帮助

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


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

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

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

如果方法中没有_process字段,但只有一个过程变量,则必须在方法中处理它:

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

MSDN示例是人为设计的。打开进程句柄的程序在启动进程后立即退出。当该程序退出时,它打开的所有句柄都将关闭


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

这是一般规则,但OP询问有关
System.Diagnostics.Process
的具体信息。我要说的是,同样在Process的情况下,规则也适用。@rsenna-您是对的,但是,明确此规则可能会帮助其他不知道为什么要使用()应该在这种情况下使用。谢谢-没有看到这个问题。我同意这是相似的,但我特别询问的是Dispose()而不是Close()。但这里公认的答案比任何其他答案都好…:P“使用对象初始值设定项也很有帮助。”即使使用
using
块,也可以使用对象初始值设定项。我知道这个问题已经很老了,但我用.NET2.0测试了这个问题,至少在很久以前它还可以正常工作。
void MyMethod()
{
    var process = ...
    ... use it here ...
    process.Dispose();
}