【发布时间】:2019-02-21 08:59:30
【问题描述】:
我有一个MainForm 和一个UserConfigForm 并使用this 中的模式回答UserConfigForm 即
private static UserConfigForm openForm = null;
public static UserConfigForm GetInstance()
{
if (openForm == null)
{
openForm = new UserConfigForm();
openForm.FormClosed += delegate { openForm = null; };
}
return openForm;
}
在UserConfigForm 内部我也有一个自动属性UserHasSaved 即
public bool UserHasSaved { get; private set; }
现在在MainForm 中,我需要检查配置表单关闭时是否需要重新加载用户配置。所以在MainForm我有,
private UserConfigForm userCfgForm;
private void OpenEditFormClick(object sender, EventArgs e)
{
userCfgForm = UserConfigForm.GetInstance();
userCfgForm.FormClosed += ConfigFormClosed;
userCfgForm.Show();
{
private void ConfigFormClosed(object sender, FormClosedEventArgs e)
{
if (userCfgForm.UserHasSaved)
{
MessageBox.Show(message, caption);
//Reload config
}
}
问题是这行得通,但我不明白为什么会这样。我有两个事件处理程序注册到FormClosed,所以我决定检查事件处理程序的处理顺序是谨慎的。
似乎事件处理程序是按照它们注册的顺序处理的。所以在delegate { openForm = null }之后我可以访问userCfgForm.UserHasSaved是没有意义的。
我应该为此担心还是只为它有效?
【问题讨论】:
-
当
userCfgForm在OpenEditFormClick方法中本地定义时,我看不到如何从ConfigFormClosed方法中访问它。该变量是否有其他同名声明? -
对不起,我编辑了。我还在
MainForm本地定义了一个UserConfigForm -
我不明白你为什么认为它的行为很奇怪。您已将相同的信息写入两个位置。你已经删除了其中一个。假设您要去度假,并在两个地方写下您的酒店房间号。当您退房时,您会扔掉其中一张纸。另一个上面还写着你的酒店房间号。它们是分开的纸片。你能解释一下为什么你认为清空一个变量会对另一个变量产生影响吗?
-
我认为您可能对将变量设置为 null 的含义有一个非常错误的想法。将变量设置为 null 的效果是:该变量现在的值为 null。如果您认为将变量设置为 null 会以某种方式破坏该变量曾经引用的对象,那么您对 C# 的工作原理有一个非常错误的想法,您应该了解它的实际工作原理。 这是你应该担心的事情。
-
不,这根本不对。
userCfgForm和openForm都引用同一个对象。它们不相互引用。 了解其中的区别是绝对重要的,如果你不明白这一点,你将无法成功地进行 C# 编程。 C#确实 允许您使用ref关键字将一个变量设为另一个变量的别名,但在您了解引用是什么之前,您不应尝试这样做。 引用就是值.