假设以下类:
public class MyClass : IDisposable
{
protected MyDisposableType1 _object1;
protected MyDisposableType2 _object2;
public MyClass()
{
}
public StartActivity1()
{
_object1 = new MyDisposableType1();
}
public StopActivity1()
{
_object1.Dispose();
_object1 = null;
}
public StartActivity2()
{
_object2 = new MyDisposableType2();
}
public StopActivity2()
{
_object2.Dispose();
_object2 = null;
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if (disposing)
{
...
}
}
}
根据Dispose pattern我应该实现IDisposeable
,因为我的班级拥有一次性类型的字段。但是我找到的所有Dispose模式示例都涉及在ctor中创建的一次性字段。在这种情况下,配置模式似乎很清楚。但是如果用户可以在MyClass
生命周期内多次创建和销毁我的一次性字段呢?我是否应该使用Dispose模式,或者是否有一些用例?
答案 0 :(得分:2)
通常,您也尝试在Dispose方法中处理字段。
会有像
这样的东西protected virtual void Dispose(bool disposing)
{
if (disposing)
{
_object1?.Dispose();
_object2?.Dispose();
}
}
如果对象为空,将使用“?” - 运算符。如果已经调用了stop方法(即“StopActivity2”),那么你就不会有例外。
答案 1 :(得分:1)
在处置MyClass
之后,您不应让用户调用依赖于已处置对象的方法。你可以通过使用布尔值来阻止这种情况。
bool _disposed;
public StartActivity1()
{
if(_disposed) return; // or throw exception.
_object1 = new MyDisposableType1();
}
public StopActivity1()
{
_object1?.Dispose();
_object1 = null;
}
//...
protected virtual void Dispose(bool disposing)
{
if (disposing)
{
_object1?.Dispose();
_object2?.Dispose();
_disposed = true
}
}