我有这门课:
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();
}
}
我使用它来继承我的其余表单。
我的想法是在所有表单中都有一个从每个地方对对象 Watcher 的引用,它对订阅它的每个表单都有一个引用。所以我可以做,例如,从 FormB
知道 FormA
已经使用 DevolverSubscriptos()
方法订阅(这意味着返回订阅者)并访问使其在关闭 FormB
后再次可见。
问题是,当我启动 FormB
时,整个表单的 Watcher 列表被设置回 0。
我做错了什么?我该如何解决?
public partial class AdminUIGI : FormBase.FormBase
这就是我引用它的方式。
最佳答案
简短回答:您使用的是实例字段。每个表单都是一个单独的实例,因此每个表单都有自己的 EE.Observador
副本。
因此,一个快速而肮脏的修复方法是使该字段成为static
,即由给定类的所有实例共享。如果你想改进,你可能会考虑阅读 Singleton 模式(主要是因为你会看到它经常使用 - 但请继续阅读 :)),然后阅读为什么使用 Singleton 作为全局变量实际上是一种反-模式,然后继续阅读有关依赖注入(inject)和 IoC 的内容——这就是(至少在真空中)您的代码可能应该结束的方式。 (注意:对于快速而肮脏的解决方案,static
字段就是您所需要的)。
关于c# - 列表在新表单后返回 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59159480/