我现在正在使用一些Winforms代码,我已经多次遇到这样的行:
...
System.Diagnostics.Process.Start(someFileName);
...
。它只是在客户端计算机上启动一些进程,并完全忘记它。Process.Start(someFileName)
返回一个Process
类型对象,该对象实现IDisposable
,但代码没有对该对象执行任何操作,因为整个想法只是触发进程并忘记它。
在这种情况下,如果我们根本不将Process
对象保留在内存中,是否仍应释放它?像这样:
using (System.Diagnostics.Process.Start(someFileName) { }
或
var process = System.Diagnostics.Process.Start(someFileName);
process.Dispose();
Process
对象包含非托管资源(HProcess
句柄(
https://referencesource.microsoft.com/#System/services/monitoring/system/diagnosticts/Process.cs,f8b2e604d6f1fe04
public class Process : Component {
//
// FIELDS
//
bool haveProcessId;
int processId;
bool haveProcessHandle;
SafeProcessHandle m_processHandle; // <- This should be disposed
bool isRemoteMachine;
string machineName;
ProcessInfo processInfo;
Int32 m_processAccess;
...
因此应该被处置。使用局部变量(var process = ...
(在上下文中看起来过分了,这就是为什么我建议
System.Diagnostics.Process.Start(someFileName).Close();