object = Nothing markerar för CLR:en att objektet är redo för garbage collection. Det säger dock inte något om när det verkligen avallokeras; CLR:en gör det i egen takt när den tycker att det passar. objekt = Nothing >> Möjligen är det så, men att sätta till Nothing här kan också betraktas som ett sätt att försäkra sig om att man gör saker i rätt ordning.Garbage Collection
Vad är skillnaden i följande hantering:
objekt.dispose()
objekt = Nothing
Vad gör de två och hjälper dessa .NET egen garbage collection. Är det någon ide att "hjälpa" GC'n med att göra dessa anrop när man inte skall använda ett objekt mer?Sv: Garbage Collection
object.Dispose() kan du anropa på klasser som implementerar IDisposable. Klasser som implementerar IDisposable ser då till att avallokera de resurser som de använder, t.ex. bitmappar, filer osv. Det säger dock ingenting om garbage collection, utan skräpsamlaren kommer att avallokera objektet i egen takt någon gång senare efter att du släppt alla referenser till det. Efter att du anropat Dispose() så bör du inte använda objektet eftersom det avallokerat sina resurser.
Man kan se Dispose som ett sätt att skynda på avallokering av resurser i de objekt som anropar Dispose på.
/AndreasSv: Garbage Collection
är nästan helt onödigt att använda i Dotnet.
Men det finns ett undantag.
<code>
Public Sub Jobba()
objekt1.BehandlaMktData()
objekt1.dispose()
objekt1 = Nothing ' <-- GC får möjlighet att kasta bort objekt1.
objekt2.ArbetaI3minuterMed50AndraMB() 'Medans detta pågår,
'så lever objekt1 och rensas inte bort av GC (om inte objekt1 = Nothing)
End Sub ' <-- alla lokala objekt sätts till Nothing automatiskt..
</code>
Men följande är meningslöst:
<code>
objekt1.Arbeta()
objekt1 = Nothing
End Sub
</code>Sv:Garbage Collection
<code>
Public Sub Jobba()
objekt1.BehandlaMktData()
objekt1.dispose()
objekt1 = Nothing ' <-- GC får möjlighet att kasta bort objekt1.
objekt2.ArbetaI3minuterMed50AndraMB() 'Medans detta pågår,
'så lever objekt1 och rensas inte bort av GC (om inte objekt1 = Nothing)
End Sub ' <-- alla lokala objekt sätts till Nothing automatiskt..
</code>
<<
Jag tror att det är onödigt att sätta objekt1 till Nothing i den där koden, har nämligen för mig att gc är så smart att den kollar ifall det finns någon chans att objektet kommer användas senare i koden eller inte. Men visst, det finns fall med t.ex. massa loopar, en massa villkor etc. där det kan vara vettigt att sätta saker till null.Sv: Garbage Collection
<code>
' EXEMPEL_A
Public Sub Jobba()
dim value As String
objekt1.BehandlaMktData()
value = objekt1.Value ' ** Rätt ! **
objekt1 = Nothing ' <-- Najs.. GC får möjlighet att kasta bort objekt1.
objekt2.ArbetaI3minuterMed50AndraMB()
value = objekt1.Value ' fungerar inte - vilket är bra, eftersom detta vore dumt
End Sub
</code>
Om jag inte satte till Nothing och sedan plockade value sist så hade objekt1 levt medans objekt2 arbetar, vilket vore onödigt. Genom att sätta till Nothing så undviker man misstaget (i VS 2005 får man dessutom 'stavningskontroll' direkt i editorn om man gör misstaget att referera objekt som är Nothing - dvs: misstaget att förbruka för mycket RAM undviks redan i editorn innan kompileringen, om man tar för vana att sätta till Nothing när det är lämpligt).