我可以在只读对象字段后安全地清理吗?

cor*_*erm 6 c# dispose readonly

假设我有一个带有对象字段的类.调用Dispose()时,我想清除对该对象的引用.私有字段只能设置一次,所以理想情况下我希望它只是readonly,但如果它是re​​adonly,当我尝试在Dispose()期间释放对象的引用时,会出现编译时错误.理想情况下,我希望安全处置并将_value字段标记为只读.这是可能的还是必要的?

public class Foo : IDisposable
{
      public Foo(object value)
      {
            _value = value;
      }

      public object Value { get { return _value; } }
      private readonly object _value;

      public void Dispose()
      {
            //Cleanup here
            _value = null     // causes compile time error
      }
}
Run Code Online (Sandbox Code Playgroud)

Ant*_*ram 5

这没有必要,即使有可能。

Dispose 通常用于清理非托管资源,尽管该规则可能有例外(请注意注释)。但是,在这种情况下,您应该让垃圾收集器完成它的工作。一旦认为对象没有活动根,它将无限期地运行。在正常情况下,您不需要采取行动来强制它。只需在适当有限的范围内使用对象编写代码,就可以了。

  • 在许多情况下,即使对于没有非托管组件的对象来说,处置也是适当且必不可少的。任何从长寿命对象接收事件的对象都必须取消订阅其所有事件(通常从 Dispose 完成),以避免被长寿命对象保持活动状态。 (12认同)

Ste*_*ger 5

将引用设置为 null 实际上并没有做任何事情。当不再有任何对它的引用时,垃圾收集器将清理该对象,在这种情况下,因为您在 Dispose 方法中执行此操作,所以 Foo 的实例将不再有任何对它的引用,并且在时间可能没有意义。通常,您实现 Dispose 模式是因为您的类型具有作为成员的类,该类本身实现了 IDisposable(在这种情况下,类型是 Object,它没有实现 IDisposable),或者您有非托管资源想要确定性地释放。您可以在此处找到 Dispose 模式的描述. 请注意,如果您创建一个实现 IDisposable 类型的只读成员变量,您可以在 Dispose 方法中对该对象调用 Dispose 方法:

public class SomeClass : IDisposable
{
    private Boolean mDisposed;
    private readonly MemoryStream mStream = new MemoryStream(); // Could be any class that implements IDisposable
    public void Dispose() {
        Dispose(true);
        GC.SuppressFinalize(this);
    }
    protected void Dispose(Boolean disposing) {
        if (disposing & !mDisposed) {
            mStream.Dispose();  // Could and should call Dispose
            mDisposed = true;
        }
        return;
    }
}
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为只读性质是对对象的引用,而不是对象本身。