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