问题描述:

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

    问题

    最好的办法是在这里做什么?我们应该吗
  • 不将OtherDisposableClass的实例标记为只读,因此我们可以在Dispose方法
  • 中将其设置为“null”
  • 将OtherDisposableClass标记为只读,并且不要再次删除对其的引用。
  • 其他的东西

  • 请详细说明您的答案。谢谢
    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;
        }
    }
    

    最佳答案

    创建OtherDisposableClass的东西应该将其丢弃...将其保留在FooClass中(如果愿意,可以将其设置为readonly)。

    将其设置为null仍然没有任何作用,它只会将FooClass中的引用设置为null(无论如何都将被处置)。

    编辑

    从给出的代码看来,您甚至不需要在此处实现IDisposable-这仅仅是使事情复杂化了。如果您在OtherDisposableClass的构造函数中创建了FooClass的实例,则可以实现IDisposable并只需在OtherDisposableClass.Dispose()内调用FooClass.Dispose()即可。

    这里创建的FooClass依赖于OtherFooClass-OtherFooClass将超过FooClass-因此,应该首先对FooClass进行GC处理,然后再不保留对OtherDisposableClass的引用-从而可以对它进行GC处理。

    关于c# - 如果对象是IDisposable类的字段,我们是否应该将对象标记为只读,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20051486/

    10-12 05:24