Proper use of the IDisposable interface

后端 未结 19 3324
情深已故
情深已故 2020-11-21 04:05

I know from reading the Microsoft documentation that the \"primary\" use of the IDisposable interface is to clean up unmanaged resources.

To me, \"unman

19条回答
  •  遇见更好的自我
    2020-11-21 04:43

    I won't repeat the usual stuff about Using or freeing un-managed resources, that has all been covered. But I would like to point out what seems a common misconception.
    Given the following code

    Public Class LargeStuff
      Implements IDisposable
      Private _Large as string()
    
      'Some strange code that means _Large now contains several million long strings.
    
      Public Sub Dispose() Implements IDisposable.Dispose
        _Large=Nothing
      End Sub
    

    I realise that the Disposable implementation does not follow current guidelines, but hopefully you all get the idea.
    Now, when Dispose is called, how much memory gets freed?

    Answer: None.
    Calling Dispose can release unmanaged resources, it CANNOT reclaim managed memory, only the GC can do that. Thats not to say that the above isn't a good idea, following the above pattern is still a good idea in fact. Once Dispose has been run, there is nothing stopping the GC re-claiming the memory that was being used by _Large, even though the instance of LargeStuff may still be in scope. The strings in _Large may also be in gen 0 but the instance of LargeStuff might be gen 2, so again, memory would be re-claimed sooner.
    There is no point in adding a finaliser to call the Dispose method shown above though. That will just DELAY the re-claiming of memory to allow the finaliser to run.

提交回复
热议问题