3

I'm using SafeHandles in my code and noticed they have Close and Dispose methods.

This got me wondering whether or not SafeHandles were handled by the garbage collector and disposed of after use.

For example if I got a handle like this, would I need to call the .Dispose or .Close method after I was finished using it.

var process Process.GetProcessesByName("notepad")[0];

var handle = process.SafeHandle;
IceCreamBoi23
  • 399
  • 5
  • 12
  • There´s usually a reason why one would implement `IDisposable`. So rely on this and dispose what *might* be disposable. Even if there´s currently no need because the class does not have any unmanaged ressources, this may change in the future. – MakePeaceGreatAgain Dec 20 '18 at 10:01
  • I would say so. More info: https://learn.microsoft.com/en-us/dotnet/api/system.runtime.interopservices.safehandle.dispose – Peter B Dec 20 '18 at 10:01
  • See also https://stackoverflow.com/questions/659840/do-i-need-to-dispose-or-close-an-eventwaithandle – dymanoid Dec 20 '18 at 10:03
  • The pattern is a bit murky here, GetProcessBy___() doesn't look like you allocate a resource. But you do, I would worry about `process` first. – bommelding Dec 20 '18 at 10:26

2 Answers2

2

From documentation:

Always call the Close or Dispose method before you release your last reference to the SafeHandle object. Otherwise, the resources it is using will not be freed until the garbage collector calls the SafeHandle object's Finalize method.

Owen Pauling
  • 11,349
  • 20
  • 53
  • 64
2

Calling the Close or Dispose method allows the resources to be freed. This might not happen immediately if other threads are using the same instance of the safe handle, but will happen as soon as that is no longer the case. Although most classes using SafeHandle do not need to provide a finalizer, this is sometimes necessary (for example, to flush out file buffers or to write some data back into memory). In this case, they can provide a finalizer that is guaranteed to run before the SafeHandle critical finalizer runs.

Always call the Close or Dispose method before you release your last reference to the SafeHandle object. Otherwise, the resources it is using will not be freed until the garbage collector calls the SafeHandle object's Finalize method.

You should never explicitly call the Dispose method with the disposing parameter set to false

See the Documentation

ArunPratap
  • 4,816
  • 7
  • 25
  • 43