2017-08-14 5 views
-1

Je travaille dans un code Winforms en ce moment, et je suis venu à travers des lignes comme ceci plusieurs fois:Dois-je utiliser une instruction using/disposer si l'objet n'est pas réellement utilisé dans le code?

... 
System.Diagnostics.Process.Start(someFileName); 
... 

... qui débute juste à côté un processus sur la machine cliente, et oublie complètement à ce sujet . Process.Start(someFileName) renvoie un objet de type Process, qui implémente IDisposable, mais le code ne fait rien avec l'objet, car l'idée était simplement de déclencher le processus et de l'oublier.

Dans ce cas, l'objet Process doit-il être éliminé, si nous ne le gardons pas du tout en mémoire? Quelque chose comme:

using (System.Diagnostics.Process.Start(someFileName) { } 

ou

var process = System.Diagnostics.Process.Start(someFileName); 
process.Dispose(); 
+0

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

+0

Si elle implémente IDisposable puis le disposer, en utilisant un() {} est la façon canonique de le faire. –

+0

La réponse courte est: Oui, vous devez disposer. Et peu importe laquelle des deux variantes de code vous utilisez (en supposant que vous ne mettez pas de code dans le bloc using) –

Répondre

0

objets Process détient ressources non géré (s) (HProcess poignée)

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; 
... 

Et ainsi doit être éliminé. En utilisant la variable locale (var process = ...) semble surréaction dans le contexte, c'est pourquoi je suggère

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