C# 我可以做一张单人表吗?

C# 我可以做一张单人表吗?,c#,winforms,singleton,C#,Winforms,Singleton,我有一个Visual C#2010应用程序,它有一个名为MainWnd的主窗体,还有其他工具窗口和对话框。我希望其他工具窗口能够与主窗体“对话”,并调用其方法。但这需要一个MainWnd的实例,而且由于在任何给定时间都只创建其中一个表单,因此我没有理由枚举MainWnd的所有实例或查找第一个实例。因此,我希望我的主应用程序表单MainWnd是一个单件,以便其他窗口可以轻松地从中调用代码 下面是我想制作一个单例的主要表单的代码: using System; using System.Compone

我有一个Visual C#2010应用程序,它有一个名为
MainWnd
的主窗体,还有其他工具窗口和对话框。我希望其他工具窗口能够与主窗体“对话”,并调用其方法。但这需要一个
MainWnd
的实例,而且由于在任何给定时间都只创建其中一个表单,因此我没有理由枚举
MainWnd
的所有实例或查找第一个实例。因此,我希望我的主应用程序表单
MainWnd
是一个单件,以便其他窗口可以轻松地从中调用代码

下面是我想制作一个单例的主要表单的代码:

using System;
using System.ComponentModel;
using System.Windows.Forms;

namespace MyLittleApp
{
    public partial class MainWnd : Form
    {
        public MainWnd()
        {
            InitializeComponent();
        }

        public void SayHello()
        {
            MessageBox.Show("Hello World!");

            // In reality, code that manipulates controls on the form
            // would go here. So this method cannot simply be made static.
        }
    }
}
我希望能够从另一个表单调用
SayHello()
,只需编写:

MainWnd.SayHello();

我怎样才能做到这一点呢?

你当然可以做到

 public MainWnd Instance = new MainWnd();
然后作为
MainWnd.Instance.SayHello()
访问

替换以下呼叫

MainWind instance = new MainWnd();

我不确定VisualStudioDesigner在将构造函数设置为私有之后会有什么反应。
但是如果它不允许,这将是Visual Studio的问题,而不是语言/编译器的问题。

您可能会找到一种使主窗口成为单例的方法,但是这不是实现所需结果的最佳方法,也不是使用单例模式的适当情况

如果所有其他工具窗口/对话框都封装在主窗口中,那么用于通信的更好模式就是事件

让内部窗口/对话框引发事件,以表示对主窗口执行某些操作的“请求”。让主窗口订阅这些事件,并通过事件处理程序完成工作

通过避免单例方法,您可以避免测试单例的困难,也可以避免大量的显式循环引用,因为主窗口不仅有对封装的窗口/对话框的引用,而且反过来又有对主窗口的显式引用。

见下文

using System;
using System.ComponentModel;
using System.Windows.Forms;

namespace MyLittleApp
{
    public partial class MainWnd : Form
    {
       public static MainWnd Instance;
        public MainWnd()
        {
            Instance = this;
            InitializeComponent();
        }

        public void SayHello()
        {
            MessageBox.Show("Hello World!");

            // In reality, code that manipulates controls on the form
            // would go here. So this method cannot simply be made static.
        }
    }
}
现在,通过调用
MainWnd.Instance

实例也可以使用它的所有成员。

您是否可以将它作为静态公共方法,然后执行您所说的操作?因为它被称为MainWnd,我希望该表单可以打开其他表单。在这种情况下,您可以在子窗体上使用一个事件,并在那里注册来自MainWnd的事件接收器。@ryadavilli正如我发布的代码中的注释所述,该方法操作窗体中的对象,因此它必须有一个实例,因此它不能只是静态的。+1肯定比我想象的要好得多。谢谢你让我看到了一个更好的设计模式:)
using System;
using System.ComponentModel;
using System.Windows.Forms;

namespace MyLittleApp
{
    public partial class MainWnd : Form
    {
       public static MainWnd Instance;
        public MainWnd()
        {
            Instance = this;
            InitializeComponent();
        }

        public void SayHello()
        {
            MessageBox.Show("Hello World!");

            // In reality, code that manipulates controls on the form
            // would go here. So this method cannot simply be made static.
        }
    }
}