cor*_*erm 6 c# dispose readonly
假设我有一个带有对象字段的类.调用Dispose()时,我想清除对该对象的引用.私有字段只能设置一次,所以理想情况下我希望它只是readonly,但如果它是readonly,当我尝试在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)
这没有必要,即使有可能。
Dispose 通常用于清理非托管资源,尽管该规则可能有例外(请注意注释)。但是,在这种情况下,您应该让垃圾收集器完成它的工作。一旦认为对象没有活动根,它将无限期地运行。在正常情况下,您不需要采取行动来强制它。只需在适当有限的范围内使用对象编写代码,就可以了。
将引用设置为 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)
这是有效的,因为只读性质是对对象的引用,而不是对象本身。