处理不在ctor中创建的字段的模式?

时间:2017-08-14 06:14:30

标签: c# .net dispose idisposable

假设以下类:

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模式,或者是否有一些用例?

2 个答案:

答案 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
    }
}