我有这个课:
public class Observador : iObservador
{
private List<Form> Forms = new List<Form>();
public void DeSubscribirse(Form form)
{
Forms.Remove(form);
}
public void Limpiar()
{
Forms.Clear();
}
public void Subscribirse(Form form)
{
Forms.Add(form);
}
public List<Form> DevolverSubscriptos()
{
return this.Forms;
}
}
在我有这样的基本形式上使用:
public partial class FormBase : Form
{
public EE.Observador Watcher = new Observador();
public FormBase()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
this.Hide();
}
}
我将在其余表单中使用该表单。
我的想法是在所有表单中都从各处引用对象监视者,并为所订阅的每种表单提供引用。因此,例如,我可以从
FormB
知道FormA
已经使用方法DevolverSubscriptos()
进行了预订(这意味着返回订户),并在关闭FormB
之后对其进行访问使其再次可见。问题是,当我启动
FormB
时,带有整个表单的Watcher列表将设置为0。我究竟做错了什么?我该如何解决?
public partial class AdminUIGI : FormBase.FormBase
这就是我引用它的方式。
最佳答案
简短的答案:您正在使用实例字段。每种形式都是一个单独的实例,因此每种形式都有它自己的EE.Observador
副本。
因此,一种快速而肮脏的解决方法是使该字段为static
,即由给定类的所有实例共享。而且,如果您想进行改进,则可以考虑阅读有关Singleton模式的信息(主要是因为您会看到它使用了很多-但请继续阅读:)),然后阅读为什么将Singleton用作全局变量实际上是一种反作用。模式,然后继续阅读有关依赖项注入和IoC的信息-这(至少在真空中)应该是代码的最终结果。 (注意:只需要一个快速且肮脏的解决方案static
字段)。