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

标签 c# winforms

我有这门课:

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/

相关文章:

C# 到 C++/CLI 到 C DLL System.IO.FileNotFoundException

c# - 白色背景的组合框 DropDownList 样式

c# - 使用统一解析具有多个构造函数的实例

c# - 每次获取Mysql后用逗号获取Mysql数据 C# Mysql

c# - ASP.NET MVC 3 中注销时清理浏览器缓存和 cookie 的问题

c# - 配置为空

c# - Winforms - 程序无法从 app.config 找到连接字符串

c# - C# 中的 JSON;发送和接收数据

c# - 测量 RichTextBox 控件中的字符串

c# - 如何计算datagridview中的行并将重复行视为单个行?