设计和通用列表清理

时间:2013-03-05 16:14:51

标签: c# design-patterns

我有观察者设计模式,并且通过静态方法完成附加/分离所需的观察者。我使用静态方法,因为每个节点的观察者列表在内存方面可能会花费很多。如果我从设计的角度来看错了,请告诉我(使用静态方法和变量是否正确?)。

    public static void Attach(FormComponentObserverBase observer)
    {
        observers.Add(observer);
    }

    public static void Detach(FormComponentObserverBase observer)
    {
        observers.Remove(observer);
    }

    public static void DetachAll()
    {
        if (observers == null)
        {
            return;
        }

        foreach (var o in observers)
        {
            Detach(o);
        }
    }

    public static void Notify(MyObservedObject c)
    {
        if (observers == null)
        {
            return;
        }

        foreach (var o in observers)
        {
            o.Update(c);
        }
}

观察者正在观察树对象结构。由于树在内存方面很昂贵,我想确保我不会在内存中保留任何额外内容。我尝试实现IDisposable接口,并通过Dispose方法,我想清理观察者和其他不必要的实例相关对象。在观察员通用列表方面,以下是否足以使观察者列表符合垃圾收集条件?

DetachAll();
observers = null; 

1 个答案:

答案 0 :(得分:0)

假设Remove实际上从列表中删除了观察者,那么就这个数据结构而言,您无需做任何其他事情。设置observers = null没有特别的理由。这只会释放用于观察者列表的少量内存,并且会使代码复杂化,因为您必须在任何地方检查null。例如,如果您的DetachAll设置observers = null,那么您的Attach必须是:

if (observers == null)
{
    // create observers list
}
observers.Add(observer);

我不建议在Dispose方法中对观察者调用Detach,因为观察者可能仍然是活动对象。

你可能不希望这是静态的。从灵活性和可测试性的角度来看,您最好使用实例对象。如果您确实需要确保程序无法创建多个实例,则可以实现单例设计模式,但这可能不是必需的。