To nie jest bezpośrednio problem PowerShell. Gdy kończy się blok using
, określony obiekt (obiekty) mają wywoływane metody. Zwykle wykonują one pewne operacje czyszczenia, często w celu uniknięcia wycieku pamięci i tak dalej. Jednak Dispose()
nie usuwa obiektu. Jeśli odniesienie do niego nadal istnieje poza blokiem using
(jak w tym przykładzie), to sam obiekt nadal znajduje się w zasięgu. Nie można go pozbyć się ze śmiecia, ponieważ wciąż istnieje odniesienie do niego, więc wciąż zajmuje pamięć.
To, co robią w twoim przykładzie, to odwołanie. Kiedy powershell
jest ustawiona na null, obiekt PowerShell, na który wskazywał, zostaje osierocony, ponieważ nie istnieją żadne inne zmienne odnoszące się do niego. Po odczytaniu tego przez garbage collector może zwolnić pamięć. Tak się stanie na końcu metody (ponieważ powershell
wykracza poza zakres), ale w ten sposób odzyskasz zasoby systemowe nieco wcześniej.
(Edit: jak Brian Rasmussen zwraca uwagę, że środowisko wykonawcze NET jest niezwykle mądry o zbieranie śmieci Po osiągnięciu ostatniej odniesienie do powershell
w kodzie, środowisko wykonawcze powinien wykryć, że nie jest to potrzebne. więcej i zwolnij go do zbierania śmieci, więc linia powershell = null;
nic nie robi.)
Nawiasem mówiąc, ten wzór wydaje mi się bardzo dziwny. Zazwyczaj podejście jest mniej więcej tak:
using (PowerShell powershell = PowerShell.Create())
{
//...
}
ten sposób powershell
wykracza poza zakres na końcu bloku using
, tuż po jej wyrzucać. Łatwiej jest określić, gdzie zmienna jest istotna, i zapisać kod, ponieważ nie potrzebujesz już linii powershell = null
. Powiedziałbym nawet, że jest to lepsza praktyka kodowania, ponieważ powershell
nigdy nie istnieje w stanie już ułożonym. Jeśli ktoś zmieni oryginalny kod i spróbuje użyć powershell
poza blokiem using
, cokolwiek się stanie, będzie prawdopodobnie złe.
To pytanie C#, a nie pytanie PowerShell. –
@AnsgarWiechers - Masz rację; po zbadaniu linku to dziwny wzór. Czy ktoś może powiedzieć, dlaczego nie skorzystał z 'using (PowerShell powershell = PowerShell.Create()) {'? Styl preferencji? –
Dla zapisu, który jest ogólnie kiepską praktyką i po prostu nie jest w ogóle potrzebny w tym kontekście. Jest mało prawdopodobne, aby to miało jakikolwiek wpływ, a gdyby tak było, byłoby to maleńkie. Zmienna powinna zostać właśnie utworzona w 'użyciu', ale nawet bez tego nie ma uzasadnienia dla jej anulowania. Pozostała część metody wypełni * bardzo * szybko, a obiekt powershell nie zużyje znacznej ilości zasobów po usunięciu. – Servy