如果对象是IDisposable类的字段,我们是否应该将对象标记为只读

MrS*_*ess 5 c# idisposable

问题描述:

  1. 我有一个实现IDisposable的类(FooClass),该类将另一个一次性对象(OtherDisposableClass)用作其构造函数的参数。
  2. 我创建一个OtherDisposableClass的实例
  3. 我创建FooClass的实例并将实例OtherDisposableClass传递给它
  4. OtherDisposableClass的实例不应是可变的,因此我将其标记为只读
  5. 我无法在我的Dispose方法中摆脱对OtherDisposableClass实例的引用

最好的办法是在这里做什么?我们应该吗

  1. 不会将OtherDisposableClass的实例标记为只读,因此我们可以在Dispose方法中将其设置为“ null”
  2. 将OtherDisposableClass标记为只读,并且不要再次删除对其的引用。
  3. 还有别的

请详细说明您的答案。谢谢

public class FooClass : IDisposable
{
    private readonly OtherDisposableClass _disposable;
    private readonly string _imageSource;
    private readonly string _action;
    private readonly string _destination;

    private bool _isInitialized;

    public FooClass(OtherDisposableClass disposable)
    {
        _disposable = disposable;
    }
    ~FooClass() 
    {
        // Finalizer calls Dispose(false)
        Dispose(false);
    }

    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }

    protected virtual void Dispose(bool disposing)
    {
        // Not possible because _disposable is marked readonly
        _disposable = null;
    }
}
Run Code Online (Sandbox Code Playgroud)

Ben*_*Ben 4

创建的东西OtherDisposableClass应该处理它......将它留在里面FooClass(如果你愿意,你可以拥有它readonly)。

将其设置为 null 无论如何都不会产生任何效果,它只会将 FooClass 内的引用设置为 null(无论如何都会被释放)。

编辑

从给出的代码来看,您甚至不需要在这里实现 IDisposable - 这只是让事情变得更加复杂。OtherDisposableClass如果您在 的构造函数中创建了 的实例,FooClass那么您可以实现 IDisposable 并只需OtherDisposableClass.Dispose()FooClass.Dispose().

这里 FooClass 是通过依赖于 OtherFooClass 创建的 - OtherFooClass 将比 FooClass 更长寿 - 因此 FooClass 应该首先被 GC'd,然后就不会剩下对 OtherDisposableClass 的引用 - 这将允许它被 GC'd