我有这个课:

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字段)。

10-04 16:18