> If you have a class that manages a resource (or something similar
> such as an unmanaged pointer), and you implement a Dispose( ) method,
> are you mandating to the users of your assembly that they *must* use
> this method to clean up (or endure leaks or whatever)? Does this
> become one of their contractual obligations in using this assembly?
You're at least saying "it'd be a really good idea for you to call Dispose
on this object when you're done with it, or something expensive is likely to
be wasted."
> Are are you simply saying to developers: "Because this class manages a
> resource, Dispose( ) gives you the opportunity to force this object to
[quoted text clipped - 3 lines]
> point) take care of cleaning up the resources, and it is *legal* for
> a program to be written this way?
Yes it's legal (if unadvisable), and the finalizer should take care. The
preferred pattern for implenting IDisposable is this (C# syntax, sorry):
class C : IDisposable
{
private void IDisposable.Dispose()
{
Dispose(true);
}
~C()
{
Dispose(false);
}
protected virtual void Dispose(bool disposing)
{
if (disposing)
{
// release managed resources
GC.SuppressFinalize(this);
}
// release unmanaged resources
}
}
> The reason I ask is that we have a quite complicated framework of
> Managed objects (actually written in Managed C++) that control
[quoted text clipped - 15 lines]
> place. It needs USession to ensure it can communicate something back
> to the application server, yet USession has been destroyed.
It's important that the finalizer for Entity not try to do anything other
than clean up resources. That probably includes attempting to communicate.
If you have a "close" protocol, let Dispose() initiate that, but just drop
the connection if you get to the finalizer.
> Has anyone come across this kind of situation before? It would seem
> to me that the only practical way of ensuring that the dependencies
[quoted text clipped - 8 lines]
> If anyone has solved this in any other different/lateral/imaginative
> way I'd be pleased to hear about it.
You may indeed need to use reference counting on the unmanaged objects if
your UEntity has a direct relationship with a USession that's managed by a
different object, just as you would in a pure unmanaged case if a single
object (USession) has two "owners".
-cd