Здравствуйте, igor-booch, Вы писали:
S>>Но не всегда можно вызвать Dispose, а освободить ресурсы необходимо.
IB>Приведите пример, когда нельзя вызвать Dispose
SafeHandle
public abstract class SafeHandle : System.Runtime.ConstrainedExecution.CriticalFinalizerObject, IDisposable
{
...
~SafeHandle ();
}
class Unmanaged
{
public static SafeHandle OpenResource(string resourceName);
}
class ResourceHolder : IDisposable
{
SafeHandle _rsrcHandle;
public ResourceHolder()
{
_rsrcHandle = Unmanaged.OpenResource();
//вызов какого-то метода, который может бросить exception
throw new SomeException();
}
public void Dispose()
{
_rsrcHandle.Dispose();
}
}
...
using (var r = new ResourceHolder())
{
}
//Dispose вызван не будет, но остается надежда на вызов Finalize (~SafeHandle).
Могло бы решиться обкладыванием где нужно try/catch и там вызывать Dispose, но так не делают, код превратится в кашу.