如果对象实际上不会在代码中使用,我应该使用 using 语句/处置吗?



我现在正在使用一些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();

最新更新