【发布时间】:2010-10-18 06:58:43
【问题描述】:
我有一个静态类(DataFormSubject),它包含一个通用的 List 对象,如下:
private static List<DataForm> dataForms = new List<DataForm>();
依赖这个列表的其他类需要在列表更新时被告知,所以我创建了一个自定义事件,以及可以在添加或删除项目时触发的关联方法,如下所示:
public delegate void DataFormsUpdatedHandler(object sender);
public static event DataFormsUpdatedHandler DataFormsUpdatedEvent;
public static void AddDataForm(DataForm df)
{
dataForms.Add(df);
if (DataFormsUpdatedEvent != null)
DataFormsUpdatedEvent(df);
}
public static void RemoveDataForm(DataForm df)
{
dataForms.Remove(df);
if (DataFormsUpdatedEvent != null)
DataFormsUpdatedEvent(df);
}
可以通过属性从静态类中获得 List,如下所示:
public static List<DataForm> DataForms
{
get { return dataForms; }
//set { dataForms = value; }
}
但这里的问题是,客户端现在可以绕过更新事件,方法是访问属性并直接添加或删除类!例如
DataFormSubject.DataForms.Add(new DataForm);
我怎样才能防止这种情况发生,或者有更好的方法来实现我想要的吗?理想情况下,我想要的是观察者可以订阅的 List 类上的更新事件!
【问题讨论】:
-
顺便说一句 - 涉及静态事件(直接或间接)的任何事情都可能导致问题。您需要非常严格地取消订阅,否则您将保持所有对象处于活动状态并耗尽内存。
-
我也不喜欢为此使用静态类,但是我还能如何维护一个可以在整个应用程序中访问的单个集合,而无需将集合从一个对象传递到另一个对象?
标签: c# list observer-pattern