gpt4 book ai didi

c# - 列表在新表单后返回 0

转载 作者:太空宇宙 更新时间:2023-11-03 22:29:04 25 4
gpt4 key购买 nike

我有这门课:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com