Non è direttamente un problema di PowerShell. Quando un blocco using
termina, gli oggetti specificati hanno i loro metodi Dispose()
chiamati. Questi in genere eseguono alcune operazioni di pulizia, spesso per evitare perdite di memoria e così via. Tuttavia, Dispose()
non elimina l'oggetto. Se esiste ancora un riferimento al blocco using
(come in questo esempio), l'oggetto stesso è ancora in ambito. Non può essere raccolto come garbage perché c'è ancora un riferimento ad esso, quindi sta ancora occupando memoria.
Quello che stanno facendo nel tuo esempio è cadere quel riferimento. Quando powershell
è impostato su null, l'oggetto PowerShell a cui puntava è orfano, poiché non vi sono altre variabili che si riferiscono ad esso. Una volta che il garbage collector lo ha scoperto, può liberare la memoria. Ciò accadrebbe comunque alla fine del metodo (perché powershell
andrebbe fuori dal campo di applicazione), ma in questo modo le risorse di sistema verranno ripristinate un po 'prima.
(Edit: Come Brian Rasmussen fa notare, il runtime .NET è estremamente intelligente sulla raccolta dei rifiuti Una volta che raggiunge l'ultimo riferimento alla powershell
nel codice, il runtime dovrebbe rilevare che non ne hai bisogno. e quindi la riga powershell = null;
non sta facendo nulla.)
A proposito, questo schema mi sembra molto strano. L'approccio comune è qualcosa di simile:
using (PowerShell powershell = PowerShell.Create())
{
//...
}
In questo modo, powershell
va fuori portata alla fine del blocco using
, subito dopo che è smaltito. È più facile dire dove è rilevante la variabile e si salva del codice perché non è più necessaria la riga powershell = null
. Direi anche che questa è una pratica di codifica migliore, perché powershell
non esiste mai in uno stato già disposto. Se qualcuno modifica il tuo codice originale e prova a usare powershell
al di fuori del blocco using
, qualsiasi cosa accada sarà probabilmente negativa.
fonte
2013-05-15 16:31:47
Questa è una domanda C#, non una domanda PowerShell. –
@AnsgarWiechers - Sei corretto; dopo aver esaminato il collegamento, però, è uno schema strano. Qualcuno può dire perché non hanno usato 'usando (PowerShell powershell = PowerShell.Create()) {'? Preferenza di stile? –
Per la cronaca questa è una pratica generalmente scarsa e semplicemente non è affatto necessaria in questo contesto. È improbabile che faccia alcuna differenza e, se lo fosse, sarebbe minuscolo. La variabile in realtà dovrebbe essere appena stata creata all'interno di "using", ma anche senza farlo, non c'è davvero alcuna giustificazione per annullarla. Il resto del metodo completerà * molto * rapidamente e l'oggetto PowerShell non consumerà un numero significativo di risorse una volta eliminato. – Servy