2017-08-14 34 views
-1

我在一些的WinForms代码的工作,现在,我所遇到的线条像这几次:如果对象实际上不会用于代码中,我应该使用using语句/ dispose吗?

... 
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(); 
+0

'System.Diagnostics.Process.Start(someFileName).Close();' –

+0

如果实现IDisposable然后清除它,使用一个(){}是执行此操作的规范方法。 –

+0

简短的回答是:你应该处置。不管你使用哪两种代码变体(假设你不把代码放入使用块) –

回答

0

Process对象持有非托管资源(S)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(); 
相关问题